2

私はJavaでコードを開発しようとしています。これにより、SQLデータベースからJDBCドライバーによってフェッチされ、DBに永続化される大量のデータを処理できるようになります。

1つのリーダースレッド、1つのライタースレッド、およびデータを処理するカスタマイズ可能な数のワーカースレッドを含むマネージャーを作成することを考えました。リーダースレッドはデータをDTOに読み取り、「処理の準備ができている」とラベル付けされたキューに渡します。ワーカースレッドはDTOを処理し、処理されたオブジェクトを「永続化の準備ができている」というラベルの付いた別のキューに配置します。ライタースレッドはデータをDBに永続化します。そのようなアプローチは最適ですか?または、データをフェッチするためにより多くのリーダーを許可する必要がありますか?私が知らないこの種のことを行うためのJavaの準備ができているライブラリはありますか?

4

5 に答える 5

3

提案されたアプローチが最適であるかどうかは、データをDBから取得し、結果をDBに書き戻すのにかかる費用と比較して、データの処理にかかる費用に大きく依存します。処理に比較的費用がかかる場合は、これでうまくいく可能性があります。そうでない場合は、ほとんどメリットがないためにかなりの複雑さを導入している可能性があります(パイプラインの並列処理は、全体的なスループットにとって重要である場合とそうでない場合があります)。

確実にする唯一の方法は、3つの段階を別々にベンチマークしてから、最適な設計を決定することです。

マルチスレッドアプローチが進むべき道であるならば、2つのキューを持つ設計は合理的に聞こえます。考慮したいもう1つのことは、各キューのサイズに制限を設けることです。

于 2010-12-08T22:31:28.777 に答える
2

私の過去からの反響が聞こえます。あなたが私の間違いを繰り返そうとしている場合に備えて、別のアプローチを提供したいと思います。それはあなたの状況に当てはまるかもしれないし、当てはまらないかもしれません。

データベースから大量のデータをフェッチしてから、データベースに永続的に戻す必要があると書きました。

処理する必要のある外部データをデータベースに一時的に挿入し、データベース内ですべての処理を実行することは可能でしょうか?これには、次の利点があります。

  1. 大量のデータを抽出する必要がなくなります
  2. 大量のデータを保持する必要がなくなります
  3. セットベースの処理を可能にします(手続き型よりも優れています)
  4. データベースがそれをサポートしている場合は、並列実行を利用できます
  5. プロセス中に発生したエラーについてレポートを作成するためのフレームワーク(テーブルとSQL)を提供します。

例を挙げると。ずっと前に、購入、支払い、および関連する顧客データをファイルから中央データベースにロードすることを目的とした(java)プログラムを実装しました。そのとき(そして私は深く後悔しています)、トランザクションを1つずつ処理する負荷を設計し、データごとにいくつかのデータベースルックアップ(sql)を実行し、最後に適切なテーブルにいくつかの挿入を実行しました。当然、ボリュームが増加すると、これはスケーリングしませんでした。

それから私は別の間違いをしました。問題だったのはデータベースだと思ったので( SELECTが遅いと聞いていたので)、データベースからすべてのデータを取り出して、JavaでALL処理することにしました。そして最後に、すべてのデータをデータベースに永続的に戻します。ロードプロセスを簡単に拡張するために、コールバックメカニズムを使用してあらゆる種類のレイヤーを実装しましたが、うまく機能させることができませんでした。

バックミラーを見ると、(笑いながら少量の)100,000行を一時的にテーブルに挿入し、そこから処理する必要がありました。処理に半日近くかかったのは、私が自由に使えるすべてのテクノロジーの力を発揮した場合、せいぜい数分かかったでしょう。

于 2010-12-09T08:51:50.703 に答える
1

Spring Batchを使用してください!それはまさにあなたが必要なものです

于 2011-06-17T07:41:41.447 に答える
1

明示的なキューを使用する代わりに、ExecutorServiceを使用してタスクを追加することもできます。このようにして、Javaマネージャーにスレッドのプールを任せます。

于 2010-12-08T23:06:21.637 に答える
1

SpringBatchが提供する機能に似たものを書くことを説明しています。私があなただったら、それをチェックします。私はあなたがそれを使って説明しているのと同じような操作をすることができて幸運でした。並列およびマルチスレッド処理、およびいくつかの異なるデータベースリーダー/ライターおよびその他の多くのものが提供されます。

于 2010-12-09T05:40:55.907 に答える