2

多数の行を持つ MySQL データベースがあります。

Java で複数のスレッド (それぞれが独自のデータベース接続を持つ) を初期化し、データを同時に読み取り/印刷したいと考えています。

2 つのスレッドが同じレコードを読み取らないように、複数のスレッド間でデータを分割する方法は? どのような戦略を使用できますか?

4

3 に答える 3

2

それは、スレッドが実行する作業の種類によって異なります。たとえば、私は通常、ある種の大規模なデータセットに対して単一の SELECT を実行し、スレッドセーフなタスク キューにタスクを追加し、キューから適切なタスクを取得して処理するワーカーを送信します。私は通常、同期せずに DB に書き込みますが、それは作業単位のサイズと DB の制約 (一意のキーなど) によって異なります。魅力のように動作します。他の方法は、単純に複数のスレッドを実行して、それらを単独で動作させることです。ただし、派手な LIMIT、OFFSET の使用は強くお勧めしません。クエリから実際に返されるよりも多くのデータ行を DB がフェッチする必要があります。

編集:同じデータを持っているというコメントを追加したので、はい、私の解決策はあなたが探しているものです

  1. 単一のクエリでデータセットを取得する
  2. キューにデータを追加する
  3. スレッドを起動します (エグゼキュータまたは新しいスレッドによって)
  4. キューからデータを取り出して処理します。
于 2013-08-07T06:06:44.040 に答える
1

大規模なデータセットに整数の主キーがある場合、アプローチの 1 つは次のようになります。

  • 同じ選択クエリを使用して行数を取得します。
  • データセット全体を同じ数のパーティションに分割します
  • 各パーティションを各スレッドに割り当てます。各スレッドには、制約として主キー値の範囲を持つ独自の選択クエリがあります。

注:このアプローチには次の問題があります

  1. データベースへのクエリ (スレッド数 + 1) を実行します。そのため、パフォーマンスに問題がある可能性があります。
  2. すべてのパーティションが等しくない場合があります (削除される ID があるため)。

このアプローチは単純で、行がスレッドのみによって厳密に処理されるようにします。

于 2013-08-07T06:43:34.567 に答える
0

シングルトン クラスを使用して、既に読み取られた行を維持できます。したがって、すべてのスレッドがそのシングルトンから行番号にアクセスできます。

それ以外の場合は、共通クラスの静的 AtomicInteger 変数を使用できます。スレッドが getAndIncrement メソッドを呼び出すたびに。したがって、スレッド間でデータを分割できます。

于 2013-08-07T05:59:01.230 に答える