5

次の動作に気付きました。

数千行を含む約 3MB のファイルがあります。行で、準備済みステートメントを分割して作成します (約 250 000 ステートメント)。

私がすることは:

preparedStatement
addBatch
do for every 200 rows {
 executeBatch
 clearBatch().
}

最後に

commit()

メモリ使用量は、メモリ不足エラーなしで約 70 MB まで増加します。メモリ使用量を下げることは可能ですか? トランザクションの動作があります (1 つが失敗すると、すべてが失敗します)。executeBatchand ...を使用してコミットすることでメモリを減らすことができましたclearBatchが、これにより、セット全体の部分的な挿入が発生します。

4

2 に答える 2

2

すべての行を同じ構造の一時テーブルに挿入でき、すべてが問題ない場合。以下を使用して、データベースにそれらをターゲットテーブルに挿入させますinsert into target (select * from temp)。一時テーブルへのインポートが失敗した場合、ターゲット テーブルで何も変更していません。

編集: 固定構文

于 2010-01-26T09:24:44.130 に答える
-1

JDBC 2.0 の「バッチ処理」機能を使用することもできます。

  1. を使用してdbconnectionを設定しますconnection.setAutoCommit(false)
  2. を使用してステートメントにバッチを追加しますstatement.addBatch(sql_text_here)
  3. バッチがすべてロードされたら、次を使用して実行します。statement.executeBatch()
  4. を使用してコミットしますconnection.commit()
  5. を使用して、必要に応じて例外をキャッチし、ロールバックしますconnection.rollback()

ロールバックの例外処理の詳細... ここに典型的なロールバック例外ハンドラがあります:

  catch( BatchUpdateException bue )
  {
    bError = true;
    aiupdateCounts = bue.getUpdateCounts();

    SQLException SQLe = bue;
    while( SQLe != null)
    {
      // do exception stuff

      SQLe = SQLe.getNextException();
    }
  } // end BatchUpdateException catch
  catch( SQLException SQLe )
  {
    ...

  } // end SQLException catch

ここを読んでください:http://java.sun.com/developer/onlineTraining/Database/JDBC20Intro/JDBC20.html#JDBC2015

于 2010-01-26T09:26:19.700 に答える