1

これが私のスクリプトの機能です:

2,700 万行のドキュメントを 1 行ずつ解析します。各行を取得して解析し、必要な情報をデータベース テーブルに挿入します (JDBC を使用)。

問題は、 prepareStatement.executeUpdate() メソッドが非同期ではないため、返されるまで待機することです。これが私のボトルネックです。2700万行を解析するのに約2日かかります:(

JDBC は非同期をサポートしていないため、それぞれの executeUpdate() 呼び出しをスレッドでラップしたいと考えています。毎回新しいスレッドを作成する必要がありますか? または、スレッド プールを使用する必要がありますか?また、そのスレッド プールを作成するにはどうすればよいですか?

行の解析にはほとんど時間がかからないため、スレッド プールで待機しているアクティブなタスクの数が使用可能なスレッドの数を上回り、オープンを待機しているタスクがボトルネックとなり、線形に戻るのではないかと心配しています。スレッド。

ありがとう

4

1 に答える 1

2
  1. 固定数のスレッドで Executor を作成します (最高のパフォーマンスが得られるものは何でも)
  2. 最大サイズ、たとえば 100 で BlockingQueue を作成します
  3. 必要な数のワーカーを Executor に送信します。それぞれが BlockingQueue への参照と独自の Connection/PreparedStatement を持っています
  4. メインスレッドはput()BlockingQueue のファイルと行を解析します
  5. ワーカーtake()は BlockingQueue から行をスレッド化し、データベースを更新します

(これは基本的なプロデューサー/コンシューマー マルチスレッド シナリオです)

于 2013-03-07T03:00:29.490 に答える