JDBCのバッチ更新

JDBCのバッチ更新とは、複数の更新SQL(DML)を一度にデータベースに送って処理させる機能で、 1個ずつSQLを発行するよりも処理が速いという利点があります。 プレースホルダを持つ同一のSQLを、パラメータを変えながら複数回実行する同種バッチ、 プレースホルダを持たない複数のSQLを実行する異種バッチの2種類がありますが、 ここでは同種バッチの例だけをご紹介します。

Connection conn = /* Connectionオブジェクト */
String query = /* SQL文 */
List paramsList = /* パラメータのリスト(ListのListかObject[]のリスト) */
PreparedStatement st = null;
try {
    conn.setAutoCommit(false);
    st = conn.prepareStatement(query);
    for(int i=0; i<paramsList.size(); i++){
        Object obj = paramsList.get(i);
        if(obj instanceof List){
            List e = (List) obj;
            for(int j=0; j<e.size(); j++){
                st.setObject(j+1, e.get(j));
            }
        } else if(obj instanceof Object[]){
            Object[] e = (Object[]) obj;
            for(int j=0; j<e.length; j++){
                st.setObject(j+1, e[j]);
            }
        }
        st.addBatch();
    }
    int [] numUpdates = st.executeBatch();
    for (int i=0; i < numUpdates.length; i++) {
        if (numUpdates[i] == -2) {
            System.out.println("Row " + i
                    + ": unknown number of rows updated");
        } else {
            System.out.println("Row " + i + " successful: "
                    + numUpdates[i] + " rows updated");
        }
    }
    conn.commit();
} catch(BatchUpdateException ex) {
    if(conn != null && ! conn.isClosed()){
        conn.rollback();
    }
    ex.printStackTrace();
} catch(SQLException ex){
    if(conn != null && ! conn.isClosed()){
        conn.rollback();
    }
    ex.printStackTrace();
} finally {
    if(st != null){
        st.close();
    }
    if(conn != null && ! conn.isClosed()){
        conn.close();
    }
}

この処理には、ListオブジェクトparamsListを渡します。 これは各レコードの更新パラメータ(配列またはリスト)のリストです。
同種バッチでバッチ更新を行うには、PreparedStatementオブジェクトを作り、 1回のSQL発行に対応するパラメータをセットしてaddBatch()メソッドを呼ぶ、 を繰り返して、最後にexecuteBatch()をコールします。
注意すべきことに、 バッチ更新は自動的にトランザクション処理になることを意味しません。 いずれかのSQLが失敗した場合にロールバックする余地を残すには、 実行前に自動コミットをoffにしておく必要があります。
executeBatch()はintの配列を返します。 これは各SQLが更新した行数を格納した配列で、要素数はSQL実行の数です。 正の整数である更新行数の代わりに、-2または-3が入っていることも考えられます。 -2は、更新処理は成功したが、更新行数を得ることができなかったことを、 -3は、更新処理に失敗したことを表します。 但し、一度更新処理に失敗したらそれから後ろのバッチをやめてしまうタイプのJDBCドライバは、 配列値に-3をセットすることはなく、代わりにBatchUpdateExceptionを発生します。 BatchUpdateExceptionはSQLExceptionのサブクラスです。

JDBC and Swing Top

(first uploaded 2005/05/14 last updated 2006/08/04, URANO398)

Gポイントポイ活 Amazon Yahoo 楽天

無料ホームページ 楽天モバイル[UNLIMITが今なら1円] 海外格安航空券 海外旅行保険が無料!