パラメーターを使用した異機種のバッチ更新

pureQuery では、異なる表を参照する INSERT、UPDATE、および DELETE ステートメントをバッチ処理できます。これらの異機種のバッチ更新を使用して、関連したすべての表をサーバーとの 1 回のネットワーク往復で更新することができます。 この異機種のバッチ更新の方法により、バッチ更新の開始を pureQuery に指示するメソッドを呼び出します。
制約事項: この機能を使用するには、アプリケーションは、Linux、UNIX、Windows、または z/OS® 上で実行中の DB2® データベースに対して SQL ステートメントを実行する必要があります。 アプリケーションは、IBM® Data Server Driver for JDBC and SQLJ を使用してそのデータベースに接続する必要があります。ご使用の pureQuery のバージョンに必要なこのドライバーのバージョンを判別するには、system requirements を参照してください。

指定された接続で実行されるようにアプリケーションが要求した後続の SQL ステートメントはすべて、メモリー内でキューに入れられます。 pureQuery はダミーの結果をアプリケーションに戻します。これは、実際にはまだ実行されていない場合でも、各ステートメントが正常に実行されたことを示します。 バッチ更新を終了することを pureQuery に指示するメソッドを呼び出します。 この時点で、pureQuery はキューに入れられているすべての SQL ステートメントを実行します。

メソッドがそれらのステートメントに値を渡す場所を示すには、SQL ステートメントで疑問符 ("?") を使用します。 さらに、:name または ?#.name を使用することもできます。name は、java.util.Map<String> オブジェクト内または Bean 内のプロパティーを参照している必要があります。パラメーター・マーカーについて詳しくは、SQL ステートメント内のパラメーター・マーカー を参照してください。

バッチ処理

  1. SQL ステートメントのバッチの開始を指示するには、以下のように startBatch() メソッドを呼び出します。
    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 をスローします。

  2. SQL ステートメントのバッチの終了を指示して、キューに入れられたステートメントを pureQuery に実行させるには、endBatch() メソッドを呼び出します。
    int[][] endBatch();
    pureQuery は、キューに入れられたステートメントを 1 回のネットワーク・トリップで実行します。 このメソッドは、update() および updateMany() メソッドが戻すはずだった更新カウントの 2 次元の整数配列を戻します。 最初の次元のサイズは、アプリケーションが SQL ステートメントの実行をサブミットした要求数と等しくなります。 2 番目の次元のサイズは以下のいずれかになります。
    1
    update() メソッドがバッチ処理されたことを示します。
    n
    updateMany() メソッドがバッチ処理された場合、n は updateMany() メソッドのデータの行数になります。
startBatch() がサブミットされて endBatch() メソッドがまだサブミットされていない状態かどうかをアプリケーションが調べる必要がある場合には、getBatchKind() メソッドを使用できます。
HeterogeneousBatchKind getBatchKind();
バッチが進行中の場合、メソッドは heterogeneousModify_ を戻します。バッチが進行中でない場合、メソッドは hetergeneousNone_ を戻します。

アプリケーションは、startBatch() メソッドを呼び出してから endBatch() メソッドを呼び出すまでの間に updateMany() メソッドを呼び出すことができます。updateMany() メソッドは、単一データベース・オブジェクトに対して単一の SQL INSERT、UPDATE、または DELETE ステートメントを複数回実行できます。 このメソッドについて詳しくは、Data インターフェースの updateMany() メソッドによる単一データベース・オブジェクトに対するバッチ更新を参照してください。

要件

バッチ更新の一部となる SQL ステートメントを実行するすべてのインライン・メソッドおよびアノテーション付きメソッドは、同じ Data オブジェクトを共用する必要があります。 これは、ユーザー・アプリケーションが使用する pureQuery メソッドの組み合わせによって多少異なります。

インライン・メソッドのみ
バッチ更新に使用できる Data のインスタンスを以下の例のように作成します。
Data data = DataFactory.getData(jdbcConnection);
data.startBatch(...);
// other Data methods that use the Data instance "data"
data.endBatch();
endBatch() メソッドを呼び出した後、アプリケーションは Data インスタンスを異なる目的で使用できます (そのように希望する場合)。
インライン・メソッドおよびアノテーション付きメソッド
Data インスタンスを作成してから、その 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();
アノテーション付きメソッドのみ
最初のインターフェースをインスタンス化してから、そのインターフェースを使用して他のすべてのインターフェースをインスタンス化します。 DataFactory が戻すインプリメンテーションは、Data インターフェースのインプリメンテーションを拡張するものです。インプリメンテーションで Data メソッドを呼び出すには、インプリメンテーションを Data タイプにキャストします。
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();
重要: データ・オブジェクトはスレッド・セーフではありません。 それらは複数のスレッドで共用しないでください。 Data オブジェクトは、作成されたのと同じスレッドでのみ使用してください。

例外

データベースでは、startBatch() から endBatch() までのすべての SQL ステートメントは 1 つのトランザクションを表します。 startBatch() を呼び出してから endBatch() を呼び出すまでに commit() または rollback() を呼び出すと、バッチは実行されず、キューに入れられた要求は失われます。 最終的に、pureQuery は RuntimeException をスローします。

1 つ以上の SQLExceptions が JDBC ドライバーから戻されると、それらは UpdateManyException 内にラップされます。

endBatch() メソッドによって UpdateManyException が発生すると、アプリケーションはメソッド int[][] getHeterogeneousUpdateCounts() を呼び戻すことができます。これは、バッチが正常に完了した場合に戻されるのと同じように、2 次元の整数配列として更新カウントを戻します。


フィードバック