分散作業単位接続の管理
CONNECT、SET CONNECTION、DISCONNECT、および RELEASE の各ステートメントは、分散作業単位 (DUW) 環境で接続を管理するために使用できます。
分散作業単位 CONNECT は、プログラムをデフォルト値である RDBCNNMTH(*DUW) を使用してプリコンパイルしたときに実行されます。 この形式の CONNECT ステートメントは、既存の接続の切断は行いませんが、直前の接続を休止状態にします。 CONNECT ステートメントで指定しているリレーショナル・データベースが現行接続になります。 CONNECT ステートメントを使用できるのは、新規の接続を開始する場合に限ります。 既存の接続間での切り替えを行いたい場合は、SET CONNECTION ステートメントを使用する必要があります。 接続はシステム資源を使用するので、必要でなくなったら接続を終了しなければなりません。 RELEASE または DISCONNECT ステートメントを使用すると、接続を終了することができます。 接続を終了させるためには、RELEASE ステートメントの後に正常なコミットを行う必要があります。
次に示すのは、コミットメント制御を使用する DUW 環境で実行される C プログラムの例です。
...
EXEC SQL WHENEVER SQLERROR GO TO done;
EXEC SQL WHENEVER NOT FOUND GO TO done;
...
EXEC SQL
DECLARE C1 CURSOR WITH HOLD FOR
SELECT PARTNO, PRICE
FROM PARTS
WHERE SITES_UPDATED = 'N'
FOR UPDATE OF SITES_UPDATED;
/* Connect to the systems */
EXEC SQL CONNECT TO LOCALSYS;
EXEC SQL CONNECT TO SYSB;
EXEC SQL CONNECT TO SYSC;
/* Make the local system the current connection */
EXEC SQL SET CONNECTION LOCALSYS;
/* Open the cursor */
EXEC SQL OPEN C1;
while (SQLCODE==0)
{
/* Fetch the first row */
EXEC SQL FETCH C1 INTO :partnumber,:price;
/* Update the row which indicates that the updates have been
propagated to the other sites */
EXEC SQL UPDATE PARTS SET SITES_UPDATED='Y'
WHERE CURRENT OF C1;
/* Check if the part data is on SYSB */
if ((partnumber > 10) && (partnumber < 100))
{
/* Make SYSB the current connection and update the price */
EXEC SQL SET CONNECTION SYSB;
EXEC SQL UPDATE PARTS
SET PRICE=:price
WHERE PARTNO=:partnumber;
}
/* Check if the part data is on SYSC */
if ((partnumber > 50) && (partnumber < 200))
{
/* Make SYSC the current connection and update the price */
EXEC SQL SET CONNECTION SYSC;
EXEC SQL UPDATE PARTS
SET PRICE=:price
WHERE PARTNO=:partnumber;
}
/* Commit the changes made at all 3 sites */
EXEC SQL COMMIT;
/* Set the current connection to local so the next row
can be fetched */
EXEC SQL SET CONNECTION LOCALSYS;
}
done:
EXEC SQL WHENEVER SQLERROR CONTINUE;
/* Release the connections that are no longer being used */
EXEC SQL RELEASE SYSB;
EXEC SQL RELEASE SYSC;
/* Close the cursor */
EXEC SQL CLOSE C1;
/* Do another commit which will end the released connections.
The local connection is still active because it was not
released. */
EXEC SQL COMMIT;
...
このプログラムでは、活動状態のアプリケーション・サーバーが 3 つあります。これらは、ローカル・システムの LOCALSYS と 2 つのリモート・システムの SYSB と SYSC です。 SYSB と SYSC は、分散作業単位と 2 フェーズ・コミットもサポートします。
最初、すべての接続は、トランザクションに関係しているアプリケーション・サーバーのそれぞれに CONNECT ステートメントを使用することによって活動状態になります。 DUW を使用する場合、CONNECT ステートメントは直前の接続を切断状態にする代わりに、休止状態にします。 すべてのアプリケーション・サーバーを接続すると、ローカル接続が SET CONNECTION ステートメントにより現行接続になります。 これにより、カーソルがオープンになってデータの最初の行が取り出されます。 次に、どのアプリケーション・サーバーでデータを更新する必要があるかが判別されます。 SYSB を更新する必要がある場合、SET CONNECTION ステートメントにより SYSB が現行接続になり、更新が実行されます。 同じことが SYSC についても行われます。 これで、変更がコミットされます。
2 フェーズ・コミットを使用しているので、変更はローカル・システムおよび 2 つのリモート・システムでコミットされることが保証されます。 カーソルに WITH HOLD が宣言されているので、コミットの後でもカーソルはオープンされたままになります。 次に現行接続がローカル・システムに変更され、データの次の行を取り出せるようになります。 取り出し、更新、およびコミットの一連の動作は、すべてのデータが処理されるまで繰り返されます。
すべてのデータが取り出されると、両方のリモート・システムの接続は解放されます。 これらの接続は保護接続を使用しているので、切断することはできません。 接続が解放されると、コミットが出され、これらの接続は終了します。 ローカル・システムは接続されたままで、処理を続行します。