2

PreparedStatement executeBatch() メソッドを使用する最良の方法を見つけようとしています。

私が試した1つの方法は次のとおりです。

try{
    prepStmt1 = conn.prepareStatement("update table set done='yes' where phone=?");
    while (operatorsQuery.next() ) {
          logger.info("phone: "+ phone + ",  operator: " + operator);

          process(); //0.5-1 second long
          prepStmt1.setString(1, "0"+phone);
          prepStmt1.addBatch();
    }
prepStmt1.executeBatch();
}
catch{...}
finally{
    closeStatmentand(prepStmt1);
}

このコードで私が抱えている問題は、プログラムが途中で終了し、executeBatch() メソッドに到達しない可能性があることです。

私が試した2番目の方法:

try{
    prepStmt1 = conn.prepareStatement("update table set done='yes' where phone=?");
    while (operatorsQuery.next() ) {
          logger.info("phone: "+ phone + ",  operator: " + operator);

          process(); //0.5-1 second long
          prepStmt1.setString(1, "0"+phone);
          prepStmt1.addBatch();
          if ((j + 1) % 100 == 0) {
               prepStmt1.executeBatch();
          }
    }
prepStmt1.executeBatch();
}
catch{...}
finally{
    closeStatmentand(prepStmt1);
}

これを行う最も好ましい方法はどれですか?

4

2 に答える 2

4

バッチ更新を使用することで、特定の呼び出しがない限り、クエリはデータベースに送信されませんexecuteBatch();。ユーザーがプログラムを終了して実行に到達しないことが心配な場合は、更新を 1 つずつ実行してみませんか。および接続はautoCommit(true);デフォルトで設定されています。

アプリケーションが閉じている場合はコミットを呼び出すことができず、バッチ更新では、への明示的な呼び出しexecuteが呼び出されるまでクエリはデータベースに送信されません。

増分バッチを実行することで十分です。

=======編集=======

問題が本当にパフォーマンスであり、アプリケーションが突然終了するという問題がある場合は、Java Message Service または JMS を使用してみてください。JMS を使用すると、メッセージを非同期に送信できます。つまり、アプリケーションはこれらの「データ」を JMS に転送し、応答を待機しません。その後、JMS をプログラムして、それらをデータベースに挿入します。JMS はまた、アプリケーション/サーバーがダウンしても、送信されたデータ (キューとも呼ばれます) が復旧しても存続するほど十分に永続的です。

JMS は初心者向けではありませんが、最初から実装するのは困難です。これが役立つことを願っています: http://docs.oracle.com/javaee/6/tutorial/doc/bncdq.html

于 2013-06-20T07:26:53.747 に答える