バッチ操作の実行
SQL Server データベースに対する更新処理が複数回にわたって発生する際のパフォーマンスを向上させるため、Microsoft JDBC Driver for SQL Server には、複数の更新処理を 1 回の作業単位として送信する機能が用意されています。この機能は、"バッチ" と呼ばれることもあります。
SQLServerStatement、SQLServerPreparedStatement、および SQLServerCallableStatement クラスはすべて、バッチ更新を送信するために使用できます。 addBatch メソッドは、コマンドを追加するために使用します。 clearBatch メソッドは、コマンドのリストをクリアするために使用します。 executeBatch メソッドは、すべてのコマンドを送信して処理するために使用します。 バッチの一部として実行できるのは、単純に更新数を返すデータ操作言語 (DML) ステートメントおよびデータ定義言語 (DDL) ステートメントだけです。
executeBatch メソッドは、各コマンドの更新数に対応する int 値の配列を返します。 いずれかのコマンドが失敗した場合は、BatchUpdateException がスローされます。そのため、BatchUpdateException クラスの getUpdateCounts メソッドを使用して、更新数の配列を取得する必要があります。 いずれかのコマンドが失敗した場合、JDBC ドライバーでは残りのコマンドの処理は続行されます。 ただし、コマンドに構文エラーがある場合は、バッチ内のステートメントが失敗します。
Note
更新数を使用する必要がない場合は、最初に SQL Server に対して SET NOCOUNT ON ステートメントを発行できます。 これによりネットワーク トラフィックが減少し、アプリケーションのパフォーマンスがさらに強化されます。
例として、AdventureWorks2022 サンプル データベースで次のテーブルを作成します。
CREATE TABLE TestTable
(Col1 int IDENTITY,
Col2 varchar(50),
Col3 int);
次の例の関数は、AdventureWorks2022 サンプル データベースに対して開かれた接続を渡され、addBatch メソッドを使って実行されるステートメントを作成し、executeBatch メソッドを呼び出してバッチをデータベースに送信すします。
public static void executeBatchUpdate(Connection con) {
try {
Statement stmt = con.createStatement();
stmt.addBatch("INSERT INTO TestTable (Col2, Col3) VALUES ('X', 100)");
stmt.addBatch("INSERT INTO TestTable (Col2, Col3) VALUES ('Y', 200)");
stmt.addBatch("INSERT INTO TestTable (Col2, Col3) VALUES ('Z', 300)");
int[] updateCounts = stmt.executeBatch();
stmt.close();
}
catch (Exception e) {
e.printStackTrace();
}
}