Hitachi

Hitachi Advanced Data Binder AP開発ガイド


9.2.4 注意事項

〈この項の構成〉

(1) 暗黙的コミットの実行

SQL文のバッチ更新機能を使用する際,次に示すSQL文をaddBatchすると,そのSQL文が実行されたときにHADBサーバが暗黙的にコミットを実行するため,注意が必要です。

(2) パラメタとSQL文のaddBatchの混在時でのバッチ更新機能

パラメタとSQL文のaddBatchが混在している場合,一括更新をしないで逐次実行します。例を次に示します。

PreparedStatement pstmt = con.prepareStatement("UPDATE T1 SET C1=? WHERE C2=?");
pstmt.setInt(1, 1);
pstmt.setInt(2, 1);
pstmt.addBatch();
pstmt.setInt(1, 2);
pstmt.setInt(2, 2);
pstmt.addBatch();
pstmt.addBatch("INSERT INTO T2 VALUES(1,2,3)");
pstmt.setInt(1, 3);
pstmt.setInt(2, 4);
pstmt.addBatch();
pstmt.setInt(1, 4);
pstmt.setInt(2, 4);
pstmt.addBatch();
pstmt.executeBatch();

このAPを実行すると,パラメタとSQL文のaddBatchが混在しているため,各addBatch単位でのSQL実行となります。そのため,次のAPを実行した場合と同じ結果となります。

PreparedStatement pstmt = con.prepareStatement("UPDATE T1 SET C1=? WHERE C2=?");
pstmt.setInt(1, 1);
pstmt.setInt(2, 1);
pstmt.executeUpdate();
pstmt.setInt(1, 2);
pstmt.setInt(2, 2);
pstmt.executeUpdate();
pstmt.executeUpdate("INSERT INTO T2 VALUES(1,2,3)");
pstmt.setInt(1, 3);
pstmt.setInt(2, 4);
pstmt.executeUpdate();
pstmt.setInt(1, 4);
pstmt.setInt(2, 4);
pstmt.executeUpdate();

なお,パラメタとSQL文のaddBatchとが混在するバッチ更新機能を使用する場合,Connectionクラスの自動コミットモードを無効にすることを推奨します。

メモ

パラメタとSQL文の混在時は逐次実行になりますが,自動コミットモードが有効の場合は,実行単位ごとにコミットが暗黙的に実行されます。そのため,バッチ更新の途中でエラーが発生すると,エラーが発生した直前までがコミットされた状態になり,どの時点までコミットされたかを認識できないので,自動コミットモードを無効にすることを推奨しています。

(3) addBatchメソッドを使用して多数のパラメタを登録する場合

addBatchメソッドを使用して登録したすべてのパラメタは,executeBatchメソッドまたはexecuteLargeBatchメソッドが実行されるまでJDBCドライバ内に保存されます。そのため,多数のパラメタを登録する際は,メモリ使用量に注意してください。

(4) 例外BatchUpdateExceptionで通知する更新カウント

バッチ更新実行時に発生する例外BatchUpdateExceptionの,getUpdateCountsメソッドの戻り値で通知する更新カウントの内容を次に示します。

ただし,例外発生時に内部的にロールバックが行われた場合,要素数0の配列を返却します。

更新カウントの例を次に示します。

■JDBCドライバによる逐次実行のプログラム例
Statement stmt = con.createStatement();
stmt.addBatch("INSERT INTO T1 VALUES(1,'aaaa')");
stmt.addBatch("INSERT INTO T1 VALUES(2,'bbbbbbbb')");...[A]
stmt.addBatch("INSERT INTO T1 VALUES(3,'cccc')");
stmt.executeBatch();

プログラム例を実行し,[A]で登録したパラメタ,またはSQLの処理でエラーになった場合,getUpdateCountsメソッドで返却する更新カウントの内容を次に示します。

更新行数がInteger.MAX_VALUEを超える可能性がある場合は,executeBatchメソッドではなく,executeLargeBatchメソッドを使用してください。また,getUpdateCountsメソッドではなく,getLargeUpdateCountsメソッドを使用してください。

(5) バッチ更新時のキャンセル

一括実行中にキャンセルを受け付けると,そのときまでに実行されたSQL文の結果は基本的にロールバックされます。ただし,次に示す範囲のSQL文はコミットされた状態になります。