0

次のことを行うスタンドアロンの Java アプリケーションを作成するタスクがあります。

  1. .csv ファイルを解析します。(これには約 300 万件のレコードが含まれます)
  2. レコードごとに、複数の DB テーブルに最大 15 行を挿入します。
  3. .csv レコードが正常に処理されたかどうかを出力します。

これを設計するための私の現在の考えは次のとおりです。

  1. .csv ファイルを読み取ります (この手順についてはまだあまり考えていません)。
  2. .csv のレコードごとに作業/タスク オブジェクトを作成します。これらすべてのタスク オブジェクトをキュー/リストに入れます。
  3. 事前定義された数のスレッドを作成します (Executor フレームワークを使用しない古い学校)

各スレッドには次のロジックがあります。

  1. DB接続を作成します。
  2. if(getNextJobFromList() != null)
    // Prepare and insert the statements in a batch update.
  3. DB リソースを閉じます。
  4. 出力のステータスを与える

ここでは時間は非常に大きな制約です。

今質問:

  1. Executor フレームワークを使用してこれを高速化できますか? 私の疑似コードでは、スレッドはその存続期間中 DB 接続を維持します。Executor フレームワークでこれを行うことはできますか?

  2. これを最適化する他の方法はありますか?

前もって感謝します :)

4

1 に答える 1

2

これを行うには、エグゼキュータを使用できます。それは素晴らしいアイデアのようには思えません。データベースを仕事で圧倒し、ほとんどのスレッドが待機に時間を費やすことになります。

マルチスレッドを必要とせずに、データベースに一括インポートする方がよいと思います(Oracleを使用している場合はSQL * Loaderを使用し、他のデータベースにも同様のツールがあります)。一括コピーは非常に高速であり、制約チェックとインデックス変更をオフにして、データを丸呑みにすることができます。JDBCよりも桁違いに高速であり、速度が必要な場合はチェックしてください。

于 2012-08-02T18:08:32.923 に答える