多数の行を持つ MySQL データベースがあります。
Java で複数のスレッド (それぞれが独自のデータベース接続を持つ) を初期化し、データを同時に読み取り/印刷したいと考えています。
2 つのスレッドが同じレコードを読み取らないように、複数のスレッド間でデータを分割する方法は? どのような戦略を使用できますか?
多数の行を持つ MySQL データベースがあります。
Java で複数のスレッド (それぞれが独自のデータベース接続を持つ) を初期化し、データを同時に読み取り/印刷したいと考えています。
2 つのスレッドが同じレコードを読み取らないように、複数のスレッド間でデータを分割する方法は? どのような戦略を使用できますか?
それは、スレッドが実行する作業の種類によって異なります。たとえば、私は通常、ある種の大規模なデータセットに対して単一の SELECT を実行し、スレッドセーフなタスク キューにタスクを追加し、キューから適切なタスクを取得して処理するワーカーを送信します。私は通常、同期せずに DB に書き込みますが、それは作業単位のサイズと DB の制約 (一意のキーなど) によって異なります。魅力のように動作します。他の方法は、単純に複数のスレッドを実行して、それらを単独で動作させることです。ただし、派手な LIMIT、OFFSET の使用は強くお勧めしません。クエリから実際に返されるよりも多くのデータ行を DB がフェッチする必要があります。
編集:同じデータを持っているというコメントを追加したので、はい、私の解決策はあなたが探しているものです
大規模なデータセットに整数の主キーがある場合、アプローチの 1 つは次のようになります。
注:このアプローチには次の問題があります
このアプローチは単純で、行がスレッドのみによって厳密に処理されるようにします。
シングルトン クラスを使用して、既に読み取られた行を維持できます。したがって、すべてのスレッドがそのシングルトンから行番号にアクセスできます。
それ以外の場合は、共通クラスの静的 AtomicInteger 変数を使用できます。スレッドが getAndIncrement メソッドを呼び出すたびに。したがって、スレッド間でデータを分割できます。