高速接続フェイルオーバーは、Oracle Database 11gの接続フェイルオーバー機能を、Java Database Connectivity(JDBC)アプリケーションがドライバに依存せずに利用できる方法を提供します。この章では、次の概念について説明します。
注意:
|
高速接続フェイルオーバー・メカニズムは、暗黙的接続キャッシュ機能に依存しています。暗黙的接続キャッシュの詳細は、第21章「暗黙的接続キャッシュ」を参照してください。
高速接続フェイルオーバーの利点は、次のとおりです。
ドライバからの独立性
高速接続フェイルオーバーは、JDBC ThinドライバおよびJDBC Oracle Call Interface(OCI)ドライバの両方をサポートしています。
暗黙的接続キャッシュとの統合
これら2つの機能は、ともに機能して相乗効果を発揮し、アプリケーションのパフォーマンスおよび高可用性を向上します。
Oracle Real Application Clusters(Oracle RAC)との統合
これにより、優れたReal Application Clusters/高可用性イベント通知メカニズムが提供されます。
アプリケーション・コードとの容易な統合
高速接続フェイルオーバーを使用可能にするのみで、他の構成は必要ありません。
高速接続フェイルオーバーの機能
高速接続フェイルオーバーを使用可能にすると、次の機能が提供されます。
キャッシュ内の無効な接続のすばやい検出およびクリーン・アップ(DOWNイベント処理)
使用可能な接続のロード・バランシング(UPイベント処理)
すべてのアクティブなOracle RACインスタンスへの実行時作業要求の分散
アプリケーションは、DataSource
インスタンスを通じて高速接続フェイルオーバーを管理します。
この項の内容は次のとおりです。
高速接続フェイルオーバーを使用するには、次の前提条件を満たしている必要があります。
暗黙的接続キャッシュが使用可能であること
高速接続フェイルオーバーは、JDBC接続キャッシュ・メカニズムとの組合せで動作します。これにより、アプリケーションは接続を管理して高可用性を確保します。
アプリケーションがデータベースへの接続にサービス名を使用していること
アプリケーションはサービス識別子を使用できません。
基礎となるデータベースには、Oracle Database 11g Real Application Clusters(Oracle RAC)機能、または単一インスタンス・データベースかOracle RACのいずれかで構成されたOracle Data Guardがあること
フェイルオーバー・イベントが伝播しないと、接続フェイルオーバーは発生しません。
JDBCが稼働しているノードでOracle Notification Service(ONS)が構成されており、使用可能であること
JDBCは、データベース・イベントの伝播およびJDBCへのイベントの通知を行うために、ONSに依存しています。
JDBCインスタンスが稼働しているJava仮想マシン(JVM)で、oracle.ons.oraclehome
がORACLE_HOME
を指すように設定されていること
高速接続フェイルオーバーを使用するには、ONSを正しく構成する必要があります。ONSは、Oracle Database 11gの一部として出荷されます。詳細は、「ONSの構成」を参照してください。
リモートONSサブスクリプションの利点は次のとおりです。
すべてのJava中間層スタックに対するサポート
クライアント・コンピュータではONSデーモンが必要ないので、このプロセスの管理が不要
DataSource
プロパティを使用した簡単な構成
高速接続フェイルオーバーに対してリモートONSサブスクリプションを使用すると、アプリケーションはOracleDataSource
インスタンスの次のメソッドをコールします。
setONSConfiguration(String remoteONSConfig)
remoteONSConfig
パラメータは、name
=
value
という形式の名前と値のペアのリストで、改行記号(\n)で区切られます。ここで、name
はnodes
、walletfile
またはwalletpassword
のいずれかです。このパラメータには、少なくともnodes
ONS構成属性を指定してください。これはhost
:
port
ペアのリストで、各ペアはカンマ(,)で区切ります。ホストとポートは、Oracle RACノードで利用できるリモートONSデーモンを示します。
Oracle Walletファイルとしてwalletfile
属性が指定されると、ONSデーモンとの通信にSSLが使用される可能性があります。そのような場合、walletpassword
属性が指定されなければ、シングル・サインオン(SSO)とみなされます。
次にいくつかの例を示します。ods
はOracleDataSource
インスタンスであるとします。
ods.setONSConfiguration("nodes=racnode1.example.com:4200,racnode2.example.com:4200"); ods.setONSConfiguration("nodes=racnode1:4200,racnode2:4200\nwalletfile=/mydir/Wallet\nwalletpassword=mypasswd"); ods.setONSConfiguration("nodes=racnode1:4200,racnode2:4200\nwalletfile=/mydir/conf/Wallet");
アプリケーションは、DataSource
インスタンスから接続を取り出す前に、そのインスタンスに対してsetFastConnectionFailoverEnabled(true)
をコールすることにより、高速接続フェイルオーバーを使用可能にします。
接続キャッシュを再初期化するときには高速接続フェイルオーバーを使用可能にできません。OracleDataSource
インスタンスを使用する前に使用可能にする必要があります。
例27-1に、高速接続フェイルオーバーを使用可能にする方法を示します。
注意: キャッシュで高速接続フェイルオーバーを使用可能にすると、そのキャッシュの存続期間中は高速接続フェイルオーバーを使用不可にできません。 |
高速接続フェイルオーバーを使用可能にするには、次の操作が必要です。
ONSを構成し起動します。ONSが正しく設定されていない場合、暗黙的接続キャッシュの作成は失敗し、最初のgetConnection
リクエストでONSException
がスローされます。
OracleDataSource
に対して最初のgetConnection
リクエストを送信する前に、FastConnectionFailoverEnabled
プロパティを設定します。高速接続フェイルオーバーが使用可能になっている場合、フェイルオーバーは接続キャッシュ内のすべての接続に適用されます。アプリケーションがConnection Cache Managerを使用して明示的に接続キャッシュを作成する場合、接続を取り出す前にFastConnectionFailoverEnabled
を設定する必要があります。
OracleDataSource
url
プロパティを設定する際、サービス識別子ではなくサービス名を使用してください。
例27-1 高速接続フェイルオーバーの有効化
// declare datasource ods.setUrl( "jdbc:oracle:oci:@(DESCRIPTION= (ADDRESS=(PROTOCOL=TCP)(HOST=cluster_alias) (PORT=1521)) (CONNECT_DATA=(SERVICE_NAME=service_name)))"); ods.setUser("scott"); ods.setConnectionCachingEnabled(true); ods.setFastConnectionFailoverEnabled(true): ctx.bind("myDS",ods); ds=(OracleDataSource) ctx.lookup("MyDS"); try { ds.getConnection(); // transparently creates and accesses cache catch (SQLException SE { } } ...
アプリケーションは、高速接続フェイルオーバーが使用可能になっているかどうかを判断するために、OracleDataSource.getFastConnectionFailoverEnabled
をコールします。フェイルオーバーが使用可能な場合はtrue
が、それ以外の場合はfalse
が戻されます。
高速接続フェイルオーバーを使用可能に設定すると、メカニズムは自動なので、アプリケーションによる操作は必要ありません。この項では、接続フェイルオーバーがアプリケーションに提示される仕組みと、アプリケーションによるリカバリの手順を説明します。
この項の内容は次のとおりです。
Oracle RACサービス障害がJDBCアプリケーションに伝播される前に、データベースはローカル・トランザクションをすでにロールバックしています。次に、キャッシュ・マネージャがすべての無効な接続をクリーン・アップします。無効な接続を保持しているアプリケーションがその接続を通して機能しようとすると、「SQLException, ORA-17008, クローズされた接続です。
」を受け取ることがあります。
アプリケーションが「クローズされた接続です。
」エラー・メッセージを受信した場合、次のことを実行する必要があります。
接続要求を再試行します。古い接続はオープンでないため、これは必須です。
トランザクションを再実行します。接続がクローズする前に実行された作業はすべて失われています。
注意: アプリケーションによってトランザクションをロールバックしないでください。アプリケーションが例外を受信した時点で、トランザクションはすでにデータベースでロールバックされています。 |
高速接続フェイルオーバーでは、キャッシュ内の各接続はサービス、インスタンス、データベースおよびホスト名へのマッピングを維持します。
データベースがOracle RACイベントを生成すると、そのイベントはJDBCが稼働中であるJVMに転送されます。JVM内のデーモン・スレッドがOracle RACイベントを受信し、それをConnection Cache Managerに転送します。次に、Connection Cache ManagerはOracle RACイベントの影響を受けるアプリケーションに対してSQL例外を発行します。
一般的なフェイルオーバーの例を次に示します。
データベース・インスタンスで障害が発生し、キャッシュ内にいくつかの失効した接続が残ります。
データベース内のOracle RACメカニズムがOracle RACイベントを生成し、そのイベントはJDBCが含まれているJVMに送信されます。
JVM内のデーモン・スレッドはOracle RACイベントの影響を受けるすべての接続を検出し、SQL例外によって接続がクローズされたことを通知し、オープンなトランザクションがあればすべてロールバックします。
各接続はSQL例外を受信し、再試行します。
高速接続フェイルオーバーと透過的アプリケーション・フェイルオーバー(TAF)は、次の点で異なります。
アプリケーションレベルでの接続の再試行
高速接続フェイルオーバーは、アプリケーションレベルでの接続の再試行をサポートしています。これにより、アプリケーションは接続のフェイルオーバーへの対応を制御できます。アプリケーションは接続を再試行するか、または例外を再発生させるかを選択できます。TAFでは、接続の再試行はOCI/Netレイヤーでのみサポートしています。
暗黙的接続キャッシュとの統合
高速接続フェイルオーバーは暗黙的接続キャッシュと高度に統合されているため、Connection Cache Managerはキャッシュを管理して高可用性を維持できます。たとえば、障害が発生した接続は、キャッシュ内で自動的に無効になります。TAFは、接続単位でネットワーク・レベルで動作するため、接続キャッシュに障害の発生を通知できません。
イベントベース
高速接続フェイルオーバーは、Oracle RACイベント・メカニズムに基づいています。したがって、高速接続フェイルオーバーは効率的で、アクティブおよび非アクティブな接続の両方で障害をすばやく検出できます。
ロード・バランシングのサポート
高速接続フェイルオーバーは、接続のUPイベント・ロード・バランシング、およびアクティブなOracle RACインスタンス間での実行時作業要求分散をサポートしています。