SQL Server データベースに対する更新処理が複数回にわたって発生する際のパフォーマンスを向上させるため、Microsoft JDBC Driver for SQL Server には、複数の更新処理を 1 回の作業単位として送信する機能が用意されています。この機能は、"バッチ" と呼ばれることもあります。
SQLServerStatement、SQLServerPreparedStatement、および SQLServerCallableStatement クラスはすべて、バッチ更新を送信するために使用できます。 addBatch メソッドは、コマンドを追加するために使用します。 clearBatch メソッドは、コマンドのリストをクリアするために使用します。 executeBatch メソッドは、すべてのコマンドを送信して処理するために使用します。 バッチの一部として実行できるのは、単純に更新数を返すデータ操作言語 (DML) ステートメントおよびデータ定義言語 (DDL) ステートメントだけです。
executeBatch メソッドは、各コマンドの更新数に対応する int 値の配列を返します。 いずれかのコマンドが失敗した場合は、BatchUpdateException がスローされます。そのため、BatchUpdateException クラスの getUpdateCounts メソッドを使用して、更新数の配列を取得する必要があります。 いずれかのコマンドが失敗した場合、JDBC ドライバーでは残りのコマンドの処理は続行されます。 ただし、コマンドに構文エラーがある場合は、バッチ内のステートメントが失敗します。
注
更新カウントを使用する必要がない場合は、まず SQL Server に対して SET NOCOUNT ON ステートメントを発行できます。 これによりネットワーク トラフィックが減少し、アプリケーションのパフォーマンスがさらに強化されます。
例として、AdventureWorks2025 サンプル データベースに次の表を作成します。
CREATE TABLE TestTable
(Col1 int IDENTITY,
Col2 varchar(50),
Col3 int);
次の例では、AdventureWorks2025 サンプル データベースへのオープン接続が関数に渡され、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();
}
}