分散作業単位接続の管理

CONNECT、SET CONNECTION、DISCONNECT、および RELEASE の各ステートメントは、分散作業単位 (DUW) 環境で接続を管理するために使用できます。

分散作業単位 CONNECT は、プログラムをデフォルト値である RDBCNNMTH(*DUW) を使用してプリコンパイルしたときに実行されます。 この形式の CONNECT ステートメントは、既存の接続の切断は行いませんが、直前の接続を休止状態にします。 CONNECT ステートメントで指定しているリレーショナル・データベースが現行接続になります。 CONNECT ステートメントを使用できるのは、新規の接続を開始する場合に限ります。 既存の接続間での切り替えを行いたい場合は、SET CONNECTION ステートメントを使用する必要があります。 接続はシステム資源を使用するので、必要でなくなったら接続を終了しなければなりません。 RELEASE または DISCONNECT ステートメントを使用すると、接続を終了することができます。 接続を終了させるためには、RELEASE ステートメントの後に正常なコミットを行う必要があります。

次に示すのは、コミットメント制御を使用する DUW 環境で実行される C プログラムの例です。

図 1. 分散作業単位プログラムの例
    ...
     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 が宣言されているので、コミットの後でもカーソルはオープンされたままになります。 次に現行接続がローカル・システムに変更され、データの次の行を取り出せるようになります。 取り出し、更新、およびコミットの一連の動作は、すべてのデータが処理されるまで繰り返されます。

すべてのデータが取り出されると、両方のリモート・システムの接続は解放されます。 これらの接続は保護接続を使用しているので、切断することはできません。 接続が解放されると、コミットが出され、これらの接続は終了します。 ローカル・システムは接続されたままで、処理を続行します。