16.3.2 バッチ更新
JDBC2.0基本規格では,Statementクラス,PreparedStatementクラス,及びCallableStatementクラスにバッチ更新機能が追加されました。バッチ更新機能によって,複数のSQL,又は複数のパラメタ値を登録し,一括して実行できるようになります。
バッチ更新機能を使用する場合,ConnectionクラスのAUTOコミットモードをOFFにする必要があります。これは,バッチ更新の途中でエラーが発生した場合に,そのトランザクションの有効・無効をアプリケーション側で制御する必要があるためです。AUTOコミットモードがON(初期状態)の場合,バッチ更新の途中でエラーが発生しても,エラーが発生する一つ前までのSQL実行は有効となります。
バッチ更新を実行する場合,HiRDBの配列を使用した機能が使用できます。
配列を使用した機能は,HiRDBに対して大量のデータを高速に更新したい場合に有効です。なお,配列を使用した機能については,「配列を使用した機能」を参照してください。
- 配列を使用した機能を利用する場合の注意事項:
-
-
配列を使用した機能は,バージョン07-01以降のHiRDBの場合に使用できます。
-
Connect時に,プロパティとしてBLOCK_UPDATE=TRUEを指定(DataSourceを使用する場合はsetBlockUpdate(true)),又はJdbcDbpsvPreparedStatementのsetBlockUpdate(true)を指定する必要があります。
-
システムプロパティのHiRDB_for_Java_BLOCK_UPDATE=TRUEを指定した場合,配列機能を有効にできます。HiRDB_for_Java_BLOCK_UPDATEについては,表「Properties infoの設定内容」のBLOCK_UPDATEを参照してください。
-
実行するSQLには,?パラメタが一つ以上なければなりません(ストアドプロシジャでは使用できません)。また,PreparedStatementクラス,又はCallableStatementクラスのaddBatch()メソッドを使用する必要があります(StatementクラスのaddBatch(String sql)メソッドを使用すると,HiRDBでエラーとなります)。
実行できるSQL文は,INSERT文,UPDATE文,又はDELETE文です。それ以外のSQL文の場合,一括実行は行われないで逐次実行されます。
-
addBatch()メソッドで登録したパラメタセットが2件以上なければなりません。1件の場合は,一括処理は行われないで通常の処理となります。また,パラメタセットが30,000件を超える場合,30,000件ごとに分割して実行されます。
-
?パラメタにデータ長が32,001バイト以上のBINARYデータを指定した場合,配列を使用した機能は適用されないため,逐次実行されます。
-
HiRDBのBLOB型の列に対して32,001バイト以上のデータを指定した場合,配列を使用した機能は適用されないため,逐次実行されます。※2
-
各列に指定するデータ型はすべて同じにしてください。※1
-
DECIMAL型データを挿入する場合,配列に指定するDECIMAL型データの精度及び位取りは,HiRDBの表定義の属性に置き換えられます。配列に指定するDECIMAL型データの整数部けた数が,HiRDBの表定義属性の整数部けた数より大きい場合,オーバフローが発生してエラーとなります。
-
?パラメタにHiRDBの繰返し列を指定している場合,配列を使用した機能は利用できません。
-
配列を使用した機能を利用してバッチ更新の途中でエラーが発生した場合,エラーが発生する直前までの実行結果はすべて無効となります。
-
Cosminexus J2EEサーバモードのベーシックモードからは,配列を使用した機能は利用できません。
-
Cosminexusから使用する場合,PreparedStatementのsetBlockUpdateメソッドは使用できません。
-
addBatch機能を使用して大量のデータを一度に更新すると,大量のJavaメモリを使用します。そのため,Javaメモリの性能によってはバッチ更新の効果が得られない場合があるので注意が必要です。また,大量のデータを使用する場合,Java起動時のヒープサイズを指定してください(java -Xms32m JavaUP:Java起動時のJavaヒープを32メガバイトと設定)。
- 注※1
-
例えば,列1のデータの1件目のaddBatchをsetInt()で指定した場合,2件目以降のaddBatchもsetInt()を使用する必要があります。
- 注※2
-
配列を使用した機能を利用する場合,HiRDBのBLOB型列に対して?パラメタを指定するときは,次のことに注意してください。
-
?パラメタに指定するデータ長が32,001バイト未満の場合は,JDBCドライバ内部でBINARY型データとして扱うため,配列を使用した機能が実行されます。32,001バイト以上の場合は,配列を使用した機能は実行されません。
-
-
(1) Statementクラスでのバッチ更新
Statementクラスでのバッチ更新の留意点を次に示します。
-
複数の更新系SQLを,addBatchメソッドで登録します。
-
登録した更新系SQLを,executeBatchメソッドで一括して実行します。
-
一括実行の結果として,それぞれの更新系SQLで更新された行数の配列を返却します。
-
一括実行の途中でエラーが発生した場合,BatchUpdateExceptionを投入します。
-
登録したSQL中に検索系SQLがある場合,executeBatchメソッド呼び出し時にBatchUpdateExceptionを投入します。
なお,JDBCドライバでは,複数のSQLを一括実行できないため,登録されたSQLを逐次実行することになります。
(2) PreparedStatementクラスでのバッチ更新
PreparedStatementクラスでのバッチ更新の留意点を次に示します。
-
PreparedStatementインスタンス生成時に指定した更新系SQLに対する?パラメタを,通常の手順(setXXXメソッド)で設定します。
-
addBatchメソッドで?パラメタのセットを登録します。
-
登録した複数セットの?パラメタを,executeBatchメソッドで一括して実行します。
-
一括実行の結果として,それぞれの?パラメタのセットで更新した行数の配列を返却します。
-
一括実行の途中でエラーが発生した場合,BatchUpdateExceptionを投入します。
-
PreparedStatementインスタンス生成時に指定したSQLが検索系SQLの場合,executeBatchメソッド呼び出し時にBatchUpdateExceptionを投入します。
JDBCドライバでは,配列を使用した機能を利用した場合,複数行の?パラメタの一括実行ができます。配列を使用した機能を利用しない場合は,複数行の?パラメタを逐次実行することになります。
- 注意事項:
-
-
HiRDBの配列を使用した機能を利用する場合,「バッチ更新」の注意事項を参照してください。
-
2件目以降のaddBatchで,setXXXメソッドで指定するパラメタ数が不足していた場合,前回セットした値が引き継がれるため注意が必要です。例を次に示します。
- 例:INTEGER型列が2列(列1,列2)ある場合
prepstmt.setInt(1,100); prepstmt.setInt(2,100); prepstmt.addBatch(); prepstmt.setInt(1,200); prepstmt.addBatch(); prepstmt.executeBatch();
- [説明]
-
-
1件目のaddBatchで設定される値は,列1=100,列2=100となります。
1件目のaddBatchでパラメタ数が不足している場合は,エラーが発生します。
-
2件目のaddBatchで設定される値は,列1=200,列2=100となります。
2件目のaddBatchで,列2の情報が更新されていないため,1件目のaddBatchの情報が引き継がれます。
-
-
(3) CallableStatementクラスでのバッチ更新
CallableStatementクラスでのバッチ更新の留意点を次に示します。
-
CallableStatementインスタンス生成時に指定したJavaストアドルーチンに対する入力パラメタを,通常の手順(setXXXメソッド)で設定します。
-
addBatchメソッドで入力パラメタのセットを登録します。
-
登録した複数セットの入力パラメタを,executeBatchメソッドで一括して実行します。
-
一括実行の結果として,それぞれの入力パラメタのセットで実行したJavaストアドルーチンの返却値(更新行数)の配列を返却します。
-
一括実行の途中でエラーが発生した場合,BatchUpdateExceptionを投入します。
-
CallableStatementインスタンス生成時に指定したJavaストアドルーチンが,更新行数を返却するルーチンでない場合,executeBatchメソッド呼び出し時にBatchUpdateExceptionを投入します。
-
CallableStatementインスタンス生成時に指定したJavaストアドルーチンが,出力パラメタ及び入出力パラメタを持つ場合,addBatchメソッド呼び出し時にBatchUpdateExceptionを投入します。
なお,JDBCドライバでは,複数行のストアドプロシジャの?パラメタを一括実行できないため,複数行のストアドプロシジャの?パラメタを逐次実行することになります。
- 注意事項:
-
-
ストアドプロシジャのバッチ更新は,INパラメタでだけ使用できます。OUTパラメタ,INOUTパラメタ,及び結果セット(ResultSet)を持つ場合はエラーとなります。
-
結果セット(ResultSet)を返すストアドプロシジャは,バッチ更新ではストアドプロシジャを実行するまで結果セットを返すかどうか分からないため,ストアドプロシジャ内で更新をしている場合,更新が反映されることがあるので注意してください。※1
-
配列を使用した機能は,ストアドプロシジャでは利用できません。?パラメタを持つSQLでだけ使用できます。
-
2件目以降のaddBatchで,setXXXメソッドで指定するパラメタ数が不足している場合,前回セットした値が引き継がれるため注意が必要です。※2
-
配列を使用した機能を利用する場合,「バッチ更新」の配列を使用した機能を利用する場合の注意事項を参照してください。
- 注※1
-
例えば,更新後にその結果を検索し取得するストアドプロシジャを,バッチ更新で実行すると,BatchUpdateExceptionが発生するが,更新は反映されてしまうことがあります。
- 注※2
-
INTEGER型列が2列(列1,列2)ある場合の例を次に示します。
callstmt.setInt(1,100); callstmt.setInt(2,100); callstmt.addBatch(); callstmt.setInt(1,200); callstmt.addBatch(); callstmt.executeBatch();
- [説明]
-
-
1件目のaddBatchで設定される値は,列1=100,列2=100となります。
1件目のaddBatchでパラメタ数が不足している場合は,エラーが発生します。
-
2件目のaddBatchで設定される値は,列1=200,列2=100となります。
2件目のaddBatchで列2の情報が更新されていないため,1件目のaddBatchの情報が引き継がれます。
-
-