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