目次 | 前の項目 | 次の項目 JDBCTM ガイド: 入門


6 バッチ更新

バッチ更新機能とは、複数の更新操作文を一度にデータベースに送り、処理させることができる機能です。更新文を 1 つ 1 つ送る代わりに複数の更新文をまとめて送るようにすると、状況次第ではパフォーマンスが大きく向上します。バッチ更新の送信には、StatementPreparedStatementCallableStatement の各オブジェクトが使用できます。

6.1     バッチ更新の使い方

6.1.1 文

バッチ更新機能を使用すると、1 つの Statement オブジェクトで、基盤となる DBMS に、異なる一連の更新コマンドを一括して (バッチとして) 送ることができます。次の例では、新入社員を架空の会社のデータベースに追加するために必要な一連の更新操作文を、1 つのバッチとして送っています。

// turn off autocommit
con.setAutoCommit(false);

Statement stmt = con.createStatement();

stmt.addBatch("INSERT INTO employees VALUES (1000, 'Joe Jones')");
stmt.addBatch("INSERT INTO departments VALUES (260, 'Shoe')");
stmt.addBatch("INSERT INTO emp_dept VALUES (1000, 260)");

// submit a batch of update commands for execution
int[] updateCounts = stmt.executeBatch(); 


この例では、Statement.executeBatch() が呼び出されたときに JDBC がトランザクションをコミットしないように、自動コミットモードを無効にしています。自動コミットを無効にすることで、エラーが発生した場合や、バッチ中の一部のコマンドの実行に失敗した場合に、トランザクションをコミットするかどうかをアプリケーション側で制御できるようになります。このような理由から、通常は、バッチ更新が終了した時点で自動コミットをオフにしておくべきです。

JDBC 2.0 の Statement オブジェクトには、まとめて送ることができるコマンドのリストを管理する機能があります。文の作成時点では、そのコマンドのリストは空です。コマンドのリストに要素を追加するには、Statement.addBatch() メソッドを使用します。バッチに結果セットを取得するコマンドが含まれている場合、Statement.executeBatch() を呼び出すと、SQLException がスローされます。バッチで実行できるのは、更新数だけを返す DLL コマンドと DML コマンドだけです。作成したコマンドのバッチを送るのを中止したい場合は、Statement.clearBatch() メソッド (上のコードにはない) を呼び出せばバッチを取り消すことができます。

Statement.executeBatch() メソッドを呼び出すと、基盤となる DBMS にコマンドのバッチが送られ、実行されます。コマンドは、バッチに追加された順序で実行されます。ExecuteBatch() は、実行されたコマンドによる更新数が含まれた配列を返します。この配列にはバッチ内のコマンドごとに 1 つのエントリが含まれており、要素はコマンドが実行された順序 (バッチに追加された順序と同じ) に並んでいます。executeBatch() を呼び出すと、Statement オブジェクトの現在の結果セットが開かれていれば、それが閉じられます。文が保持しているバッチコマンドの内部リストは、executeBatch() の実行が終了すると、空の状態にリセットされます。

バッチ中のコマンドの実行に失敗すると、executeBatch()BatchUpdateException をスローします。BatchUpdateException.getUpdateCounts() メソッドを使用すると、実行に成功したコマンドによる更新数が含まれた整数型配列を取得できます。Statement.executeBatch() は、最初のコマンドがエラーを返すと実行が中断され、また、コマンドが実行される順序はコマンドがバッチに追加された順序なので、BatchUpdateException.getUpdateCounts() が返した配列の要素数が N 個であれば、バッチ中の最初の N 個のコマンドが実行に成功したということになります。

6.1.2 PreparedStatement

バッチ更新機能を PreparedStatement と組み合わせて使用すると、1 つの PreparedStatement オブジェクトに複数の入力パラメータ値のセットを関連付けることができます。これにより、パラメータ値のセットを、パラメータをとる形式の更新コマンドと一緒に、基盤となる DBMS エンジンにまとめて送ることができます。

下の例では、2 人の新入社員のレコードを 1 回のバッチ処理でデータベースに追加しています。各パラメータセット (社員ごとに 1 つ) の作成は PreparedStatement.setXXX() で行い、現在のバッチへのパラメータセットの追加は PreparedStatement.addBatch() メソッドで行なっています。

// turn off autocommit
con.setAutoCommit(false);

PreparedStatement stmt = con.prepareStatement(
	"INSERT INTO employees VALUES (?, ?)");

stmt.setInt(1, 2000);
stmt.setString(2, "Kelly Kaufmann");
stmt.addBatch();

stmt.setInt(1, 3000);
stmt.setString(2, "Bill Barnes");
stmt.addBatch();
 
// submit the batch for execution
int[] updateCounts = stmt.executeBatch();


最後に、PreparedStatement.executeBatch() で更新内容を DBMS に送っています。PreparedStatement オブジェクトの場合のエラー処理は、Statement オブジェクトの場合と同じようにして行います。

6.1.3 CallableStatement

バッチ更新機能では、PreparedStatement オブジェクトと同じように CallableStatement オブジェクトも使用できます。複数の入力パラメータ値のセットを 1 つの CallableStatement に関連付け、まとめて DBMS に送ることができます。CallableStatement を使用したバッチ更新機能で呼び出されるストアドプロシージャは、更新数を返すものでなければなりません。また、このようなストアドプロシージャでは、OUT パラメータと INOUT パラメータは使用できません。この規則に反した場合は、CallableStatement.executeBatch() は例外をスローします。



目次 | 前の項目 | 次の項目
jdbc@eng.sun.com または jdbc-business@eng.sun.com
Copyright © 1996, 1997 Sun Microsystems, Inc. All rights reserved.