9.2.4 注意事項
- 〈この項の構成〉
(1) 暗黙的コミットの実行
SQL文のバッチ更新機能を使用する際,次に示すSQL文をaddBatchすると,そのSQL文が実行されたときにHADBサーバが暗黙的にコミットを実行するため,注意が必要です。
-
定義系SQL
-
PURGE CHUNK文
-
TRUNCATE TABLE文
(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メソッドの戻り値で通知する更新カウントの内容を次に示します。
-
実行したSQL数と要素数が等しい配列
-
各配列要素には更新行数を設定
ただし,例外発生時に内部的にロールバックが行われた場合,要素数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メソッドで返却する更新カウントの内容を次に示します。
-
要素数1の配列
-
要素0の値:更新行数
更新行数がInteger.MAX_VALUEを超える可能性がある場合は,executeBatchメソッドではなく,executeLargeBatchメソッドを使用してください。また,getUpdateCountsメソッドではなく,getLargeUpdateCountsメソッドを使用してください。
(5) バッチ更新時のキャンセル
一括実行中にキャンセルを受け付けると,そのときまでに実行されたSQL文の結果は基本的にロールバックされます。ただし,次に示す範囲のSQL文はコミットされた状態になります。
-
自動コミットモードを有効にしている場合:最後に正常終了したSQL文まで
-
自動コミットモードを無効にしている場合:最後に正常終了した,暗黙的コミットを行うSQL文まで