指定された接続で実行されるようにアプリケーションが要求した後続の SQL ステートメントはすべて、メモリー内でキューに入れられます。 pureQuery はダミーの結果をアプリケーションに戻します。これは、実際にはまだ実行されていない場合でも、各ステートメントが正常に実行されたことを示します。 バッチ更新を終了することを pureQuery に指示するメソッドを呼び出します。 この時点で、pureQuery はキューに入れられているすべての SQL ステートメントを実行します。
メソッドがそれらのステートメントに値を渡す場所を示すには、SQL ステートメントで疑問符 ("?") を使用します。 さらに、:name または ?#.name を使用することもできます。name は、java.util.Map<String> オブジェクト内または Bean 内のプロパティーを参照している必要があります。パラメーター・マーカーについて詳しくは、SQL ステートメント内のパラメーター・マーカー を参照してください。
data.startBatch(HeterogeneousBatchKind.heterogeneousModify_);このメソッドを呼び出した後、pureQuery は、アプリケーションが Data インターフェースの同じインプリメンテーションに対して実行することを要求する、すべての SQL ステートメントをキューに入れます。 pureQuery は、アプリケーションが endBatch() メソッドを呼び出すまで、INSERT、UPDATE、および DELETE ステートメントをキューに入れ続けます。ステートメントをキューに入れるときに、pureQuery は、各ステートメントが正常に実行されたことを示すダミーの結果をアプリケーションに戻します。
アプリケーションは INSERT、UPDATE、および DELETE ステートメントのみを実行するように要求できます。pureQuery は他のすべてのタイプの SQL ステートメントを拒否し、それらのステートメントは接続に対して実行されません。 アプリケーションが別のタイプの SQL ステートメントをサブミットすると、pureQuery は例外をスローして、バッチ用にキューに入れられたすべてのステートメントをクリアします。 さらに、pureQuery は例外の原因となったステートメントを実行しません。
アプリケーションが endBatch() メソッドを呼び出す前に startBatch() メソッドを再度呼び出すと、pureQuery はバッチ処理を停止して、キューに入れられたステートメントを消去し、RuntimeException をスローします。
int[][] endBatch();pureQuery は、キューに入れられたステートメントを 1 回のネットワーク・トリップで実行します。 このメソッドは、update() および updateMany() メソッドが戻すはずだった更新カウントの 2 次元の整数配列を戻します。 最初の次元のサイズは、アプリケーションが SQL ステートメントの実行をサブミットした要求数と等しくなります。 2 番目の次元のサイズは以下のいずれかになります。
HeterogeneousBatchKind getBatchKind();バッチが進行中の場合、メソッドは heterogeneousModify_ を戻します。バッチが進行中でない場合、メソッドは hetergeneousNone_ を戻します。
アプリケーションは、startBatch() メソッドを呼び出してから endBatch() メソッドを呼び出すまでの間に updateMany() メソッドを呼び出すことができます。updateMany() メソッドは、単一データベース・オブジェクトに対して単一の SQL INSERT、UPDATE、または DELETE ステートメントを複数回実行できます。 このメソッドについて詳しくは、Data インターフェースの updateMany() メソッドによる単一データベース・オブジェクトに対するバッチ更新を参照してください。
バッチ更新の一部となる SQL ステートメントを実行するすべてのインライン・メソッドおよびアノテーション付きメソッドは、同じ Data オブジェクトを共用する必要があります。 これは、ユーザー・アプリケーションが使用する pureQuery メソッドの組み合わせによって多少異なります。
Data data = DataFactory.getData(jdbcConnection); data.startBatch(...); // other Data methods that use the Data instance "data" data.endBatch();endBatch() メソッドを呼び出した後、アプリケーションは Data インスタンスを異なる目的で使用できます (そのように希望する場合)。
Data data = DataFactory.getData (jdbcConnection); // now use "data" to instantiate the interfaces that will be used EmployeeInterface emp = DataFactory.getData (EmployeeInterface.class, data); DepartmentInterface dept = DataFactory.getData (DepartmentInterface.class, data); data.startBatch(...); // other Data and Annotated (EmployeeInterface and DepartmentInterface) methods data.endbatch();
EmployeeInterface emp = DataFactory.getData (EmployeeInterface.class, jdbcConnection); DepartmentInterface dept = DataFactory.getData (DepartmentInterface.class, (Data) emp); Data data = (Data) emp; data.startBatch(...); // other Annotated (EmployeeInterface and DepartmentInterface) methods data.endbatch();
データベースでは、startBatch() から endBatch() までのすべての SQL ステートメントは 1 つのトランザクションを表します。 startBatch() を呼び出してから endBatch() を呼び出すまでに commit() または rollback() を呼び出すと、バッチは実行されず、キューに入れられた要求は失われます。 最終的に、pureQuery は RuntimeException をスローします。
1 つ以上の SQLExceptions が JDBC ドライバーから戻されると、それらは UpdateManyException 内にラップされます。
endBatch() メソッドによって UpdateManyException が発生すると、アプリケーションはメソッド int[][] getHeterogeneousUpdateCounts() を呼び戻すことができます。これは、バッチが正常に完了した場合に戻されるのと同じように、2 次元の整数配列として更新カウントを戻します。