0

次のタスクにマルチスレッドを使用する価値があるかどうかはわかりません。入力ファイルを読み取り、すべての行について、DB 内のテーブルを読み取り、(同じ ID を持つ) レコードが存在するかどうかを確認し、そのテーブル内のレコードを追加または更新します。

できます:

  1. データベースを 1 行ずつ順番に読み書きする単一のスレッドを使用する

  2. マルチスレッドを使用します。より多くのスレッドが同じ作業を行い、同時により多くの行を追加または更新します。

ありがとう。

4

3 に答える 3

1

Java タスクを開発していますが、マルチスレッドを使用する価値があるかどうかわかりません。

答えは、データベース システムのパフォーマンスに大きく依存します。IO 帯域幅に余裕がある場合は、マルチスレッドが役立つ場合があります。しかし、それは IO バウンドである可能性があります。問題に複数のスレッドを追加したとしても、それらはデータベース IO 帯域幅を待っているだけで、同時実行はあまり実行されない可能性があります。ほんのわずかな速度の向上のみを確認するために、変換にプログラミング時間を費やす場合があります。

ルックアップのスレッド化に時間を費やすよりも、データベースを SSD ドライブに移動することで、パフォーマンスが大幅に向上する可能性があります。

于 2013-09-30T20:55:20.183 に答える
0

Springs バッチ アップデート (Spring を使用できる場合) に行ってみませんか。これは非常にシンプルで、スケーリング オプションがたくさんあります。同様の要件がありました。私は 2 つの異なるアプローチを使用しました。ファイルを1行ずつ読み取り、10000などの制限に達するまでリストに保存し、制限に達したらスレッドを作成してリストに渡します。これは、データを検証してファイルに書き込むために使用します(個々のスレッドはファイルに書き込むために使用します)。すべての操作が完了したら、SQLローダーを呼び出すために使用します。

  1. ファイルの読み取りはマルチスレッドを使用して行うことはできません (実行してもパフォーマンスに違いはありません)。

  2. マルチスレッド ID は、DB に書き込む前に多くの検証がある場合に役立ちます。

  3. 接続プールは常にスレッド数よりも大きくする必要があります

  4. SQLローダーは私に重要なパフォーマンスを与えましたが、データのチャンクの書き込み量はパフォーマンスを提供し、そうでなければスレッドの生成に費やされる時間はビジネスロジックの実際の実行よりも長くなります

私が使用したもう1つのアプローチは、ファイルからデータのチャンクを読み取るSpringバッチで、ステートメントを準備し、一括ロードを行います。コーディングが簡単です。性能に差があります。

複数のdb呼び出しを行うのではなく、dbからすべてのデータを読み取って(はい、メモリを消費します)、ステートメントの準備中にデータを検証できないのはなぜですか(挿入/更新を決定します)

于 2013-09-30T21:59:45.737 に答える
0

私の経験から、複数のスレッドでファイルを読み取ることは、1 つのスレッドでファイルを読み取るよりも速くありません。速くなるとは思わない。

PreparedStatementsバッチ更新を使用すると、データベースへの書き込みが高速になります。

複数のトランザクションが原因で、複数のスレッドがそれを高速化するとは思いませんが、書き込みのパフォーマンスが低下することは間違いありません。

しかし、有効な答えは 1 つだけです。 測定することです。

また、パフォーマンスの問題がない場合は、修正しようとしないでください。これにより、コードが悪化します。

于 2013-09-30T21:10:36.157 に答える