7

更新ステートメントを格納するクラスがあります。これによりデッドロックが発生しているため、並列 for ループ内でこれらのステートメントを実行できません。

ループが完了すると、ステートメントが実行されます。100 行のシナリオでは問題なく動作します。しかし、特定のシナリオでは、100,000を超えるステートメントが生成されます。これらのステートメントを順次ループで実行すると、時間がかかりすぎます。

私が達成したいのは、クラスに 100 個のステートメントを追加するときに、これらのステートメントを別のスレッドで実行し、ステートメント変数をクリアして、次の 100 個を追加して実行できるようにすることです。

私はマルチスレッドが初めてです。これは達成可能ですか?そうでない場合は、実行時間を短縮するために他のオプションを使用します。他にも多くの要因が付随しているため、ステートメントのロジックを変更できないことに注意してください。

私のシナリオをさらに明確にしましょう。私が持っているそのテーブルは、クライアントに転送されたSQL行を追跡するログテーブルであり、同じオブジェクトを2回再送信しません。これは、オブジェクトがインターネット リンクを介して転送されるため、帯域幅の使用を削減するためです。

最初は、クライアントからの返信を受け取るとすぐに各ステートメントを実行していました。これは、ループがシーケンシャルな場合にはうまく機能しましたが、遅すぎることが判明しました。そこで、並列 for ループを使用することにしました。これは、同じテーブルがほぼ同時に選択され、挿入され、更新され、デッドロックが発生したため、すべての問題が発生した場所です。

そこで、後で実行するためにステートメントを文字列のリストに保持することにしました。

string.join を使用してすべての文字列を単一の文字列に変換しようとしましたが、これによりシステムのメモリ不足例外が発生しました。したがって、それらを1つずつ順番に実行します。現在、転送には 5 分、実行には 30 分かかります。だから私はこれに対する解決策を探しています..

4

2 に答える 2