バッチ操作の実行

SQL Server データベースに対して複数の更新を行っているときのパフォーマンスを向上させるために、Microsoft SQL Server JDBC Driver には、複数の更新を単一の作業単位 (バッチ) として送信する機能があります。

SQLServerStatementSQLServerPreparedStatement、および 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();
   }
}

参照

その他のリソース

JDBC ドライバでのステートメントの使用