自動クライアント・リルートの例

自動クライアント・リルート (ACR) は、クライアント・アプリケーションを、障害の発生したデータベース・サーバーから、事前にこの目的で指定および構成されていた 2 次データベース・サーバーに転送できます。 この Db2® サーバー機能をテストしてデモンストレーションするクライアント・アプリケーションを簡単に作成できます。

以下は、クライアント・アプリケーションでの自動クライアント・リルートの例です (疑似コードだけを使用しています)。
        int checkpoint = 0;

        check_sqlca(unsigned char *str, struct sqlca *sqlca)
        {
           if (sqlca->sqlcode == -30081)
           {
              // as communication is lost, terminate the application right away
              exit(1);
           }
           else
           
              // print out the error
              printf(...);  

        	if (sqlca->sqlcode == -30108)
        	{
        	   // connection is re-established, re-execute the failed transaction
                 if (checkpoint == 0)
                 {
                     goto checkpt0;
                 }
        	   else if (checkpoint == 1)
                 {
                    goto checkpt1;
                 }
                 else if (checkpoint == 2)
                 {
                     goto checkpt2;
                 }
                 ....
                 exit;
        	}
         }
        }

        main()
        {
           connect to mydb;
           check_sqlca("connect failed", &sqlca);

        checkpt0:
           EXEC SQL set current schema XXX;
           check_sqlca("set current schema XXX failed", &sqlca);

           EXEC SQL create table t1...;
           check_sqlca("create table t1 failed", &sqlca);

           EXEC SQL commit;
           check_sqlca("commit failed", &sqlca);
 
           if (sqlca.sqlcode == 0)
           {
              checkpoint = 1;
           }

        checkpt1:
           EXEC SQL set current schema YYY;
           check_sqlca("set current schema YYY failed", &sqlca);

           EXEC SQL create table t2...;
           check_sqlca("create table t2 failed", &sqlca);   

           EXEC SQL commit;
           check_sqlca("commit failed", &sqlca);
 
           if (sqlca.sqlcode == 0)
           {
              checkpoint = 2;
           }
        ...
        }

クライアントマシンでは、mydbというデータベースがカタログ化され、ノードhornetを参照します。このデータベースは、hornetもノードディレクトリ(ポート番号456のホスト名hornet)にカタログ化されています。

非 HADR データベースを使用する例

サーバー ホーネット (ホスト名はポート番号を持つ hornet と等しい) で、データベース MyDB が作成されます。 また、データベースMyDB も代替サーバー (ホスト名 montero 、ポート番号 456) に作成されます。 サーバー hornet のデータベース MyDB の代替サーバーは、次のように更新しなければなりません。
   db2 update alternate server for database mydb using hostname montero port 456

上記のサンプル・アプリケーションでは、自動クライアント・リルート・フィーチャーをセットアップしない場合、create table t1 ステートメントで通信エラーが発生するとアプリケーションは終了します。 自動クライアント・リルート・フィーチャーがセットアップされていると、 Db2 データベース・マネージャーは、ホスト hornet (ポート 456 を使用) への接続を再度確立しようとします。 それでも機能しない場合、 Db2 データベース・マネージャーは代替サーバー・ロケーション (ホスト montero 、ポート 456) を試行します。 代替サーバー・ロケーションへの接続で通信エラーが発生しなければ、 アプリケーションは後続のステートメントを実行し続ける (そして、失敗したトランザクションを再実行する) ことができます。

HADR データベースを使用する例

サーバー hornet (ホスト名はポート番号の付いた hornet と等しい) で、プライマリデータベース MyDB が作成されます。 スタンバイデータベースも、ポート456を使用してホストmonteroに作成されます。 1 次データベースとスタンバイ・データベースの両方の HADR をセットアップする方法については、 高可用性災害時リカバリー (HADR) の初期設定を参照してください。 データベース MyDB の代替サーバーは、次のように更新しなければなりません。
   db2 update alternate server for database mydb using hostname montero port 456

示されているサンプル・アプリケーションでは、自動クライアント・リルート・フィーチャーをセットアップしない場合、create table t1 ステートメントで通信エラーが発生するとアプリケーションは終了します。 自動クライアント・リルート・フィーチャーがセットアップされている場合、 Db2 データベース・システムは、ホスト hornet (ポート 456 を使用) への接続を再度確立しようとします。 それでも機能しない場合、 Db2 データベース・システムは代替サーバー・ロケーション (ホスト montero 、ポート 456) を試行します。 代替サーバー・ロケーションへの接続で通信エラーが発生しなければ、 アプリケーションは後続のステートメントを実行し続ける (そして、失敗したトランザクションを再実行する) ことができます。

HADR を使用して構成された Db2 pureScale 環境では、動作は類似しています。 初めてクライアントが 1 次データベースに接続すると、サーバーは、すべての 1 次側のメンバーのアドレスと、スタンバイ・メンバーのホスト名とポートを指定している代替サーバーのアドレスを戻します。 クライアントは、1 次側のあるメンバーに接続できない場合、別のメンバーへの接続を試みます。 1 次側のどのメンバーにも接続できない場合は、指定された代替サーバー・アドレスのスタンバイへの接続を試みます。

SSL を使用する例

接続に SSL を使用している間も、クライアント・リルートを使用できます。 セットアップは、前述の例で示した HADR データベースのものと似ています。

クライアントマシンでは、データベースmydbのデータベースエイリアスmydb_sslがカタログ化され、ノードhornet_sslを参照します。 hornet_sslはノードディレクトリにカタログ化されます(ホスト名はhornet、SSLポート番号は45678、安全パラメータはSSLに設定されています)。

データベースエイリアスも代替サーバーにカタログ化されます(ホスト名はmontero、SSLポート番号は45678、安全パラメーターはSSLに設定されています)。 また、次のように、サーバーhornetでエイリアスmydb_sslの代替サーバーを更新する必要があります。
db2 update alternate server for database mydb_ssl using hostname montero port 45678 

提供されているサンプル・アプリケーションで、接続ステートメントを connect to mydb_sslに変更します。 自動クライアント・リルート・フィーチャーをセットアップしない場合、create table t1 ステートメントで通信エラーが発生するとアプリケーションは終了します。 自動クライアント・リルート・フィーチャーがセットアップされている場合、 Db2 データベース・マネージャーは、SSL を使用してホスト hornet (ポート 45678 を使用) への接続の確立を再試行します。 それでも機能しない場合、 Db2 データベース・マネージャーは SSL を使用して代替サーバー・ロケーション (ポート 45678 のホスト montero ) を試行します。 代替サーバー・ロケーションへの接続で通信エラーが発生しなければ、 アプリケーションは後続のステートメントを実行し続ける (そして、失敗したトランザクションを再実行する) ことができます。