ヘッダーをスキップ
Oracle® Universal Connection Pool for JDBC開発者ガイド
12cリリース1 (12.1)
B71309-02
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次
索引へ移動
索引

前
 
次
次へ
 

8 Oracle RAC機能の使用方法

この章の内容は次のとおりです。

Oracle RAC機能の概要

UCP JDBC接続プールは、様々なOracle Real Application Cluster (Oracle RAC)データベース機能と緊密に統合されています。これらの機能には、高速接続フェイルオーバー(FCF)、実行時接続ロード・バランシングおよび接続アフィニティがあります。これらの機能には、Oracle JDBCドライバ、Oracle RACデータベース、Oracle Clientソフトウェアに同梱されているOracle Notification Serviceライブラリ(ons.jar)を使用する必要があります。


関連項目:

これらのテクノロジの詳細は、『Oracle Real Application Clusters管理およびデプロイメント・ガイド』を参照してください。


注意:

Oracle Database 11gリリース1(11.2)から、単一インスタンス・データベースのFCFもOracle Restartでサポートされます。Oracle Restartは、単一インスタンスの高可用性(SIHA)としてすでに知られています。Oracle Restartの詳細は、『Oracle Database管理者ガイド』を参照してください。

アプリケーションはOracle RAC機能を使用して、接続のパフォーマンスおよび可用性を最大化し、接続の問題による停止時間を軽減します。アプリケーションの可用性およびパフォーマンスの要件は一様ではないため、それに応じてOracle RAC機能を実装する必要があります。

一般的な高可用性およびパフォーマンスの機能

UCP for JDBC APIおよび接続プールのプロパティには、Oracle RACデータベースを必要としない、多くの高可用性およびパフォーマンスの機能があります。これらの機能は、OracleとOracle以外のどちらの接続とも連携して有効に機能します。これらの機能については、このガイド全体を通して説明します。たとえば、流用時の接続の検証、タイムアウト・プロパティの設定、最大再利用プロパティの設定、接続プール・マネージャ操作はすべて、高いレベルの接続の可用性および最適なパフォーマンスを確保するために使用されます。


注意:

一般的な高可用性およびパフォーマンスの機能は、Oracle接続を使用する場合の方がわずかによく機能します。これは、UCP for JDBCがOracle JDBCの内部APIを利用するためです。

Oracle RACのデータベースのバージョン互換性

表8-1に、様々なOracle RAC機能でサポートされているデータベースのバージョンを示します。

表8-1 Oracle RACのバージョン互換性

機能 サポートされているデータベースのバージョン

高速接続フェイルオーバー

Oracle Database 10.1.x以上のバージョン

実行時接続ロード・バランシング

Oracle Database 10.2.x以上のバージョン

Webセッション・アフィニティ

Oracle Database 11.1.x以上のバージョン

トランザクションベースのアフィニティ

Oracle Database 10.2.x以上のバージョン(Oracle Database 11.1.xを推奨)


Oracle RAC用のOracle JDBCドライバのバージョン互換性

Oracle JDBCドライバ10.1.x以上のバージョンがOracle RAC機能でサポートされています。

高速接続フェイルオーバーの使用方法

この項では、次の項目について説明します。

高速接続フェイルオーバーの概要

高速接続フェイルオーバー(FCF)機能は、接続プールを通して実装される高速アプリケーション通知(FAN)クライアントです。この機能には、Oracle JDBCドライバおよびOracle RACデータベースか、または単一インスタンス・データベース上のOracle Restartを使用する必要があります。この項では、Oracle RACでFCFを使用する際にアプリケーションで実行する必要がある手順についてのみ説明します。Oracle RACデータベースの設定の詳細は、『Oracle Real Application Clusters管理およびデプロイメント・ガイド』を参照するか、Oracleデータベース管理者に問い合せてください。

FCFは、高可用性のためにプールされた接続を管理します。次の機能があります。

  • FCFは計画外停止をサポートします。デッド接続はすぐに検出され、中断されてプールから削除されます。接続の削除では、中断が発生するとすみやかにソケット接続を切断し、ハングを回避します。流用された接続および使用中の接続には、計画外停止の場合にのみ割込みが発生します。

  • FCFで計画停止をサポートします。流用された接続および使用中の接続には、処理が完了して接続の制御がプールに戻るまで、割込みやクローズは発生しません。

  • FCFは、再試行を確実かつ効果的に行うため、致命的な接続エラーおよび例外をisValid APIにカプセル化します。このAPIの使用方法は、「接続の有効性のチェック」を参照してください。

  • FCFは、Oracle RACクラスタに加わる新規ノードを認識して、新しい接続を適切にそのノードに配置し、アプリケーションの実行時に最高品質のサービスを提供します。これにより、Oracle RACノードの追加とアプリケーション層からの作業リクエスト・ルーティングの中間層の統合が容易になります。

  • FCFは、実行時作業リクエストをすべてのアクティブなOracle RACインスタンスに配布します。

計画外停止のシナリオ

FCFでは、Oracle RACクラスタに対する失効した接続を検出および削除することで、計画外停止のシナリオをサポートします。失効した接続には、サービス停止およびノード停止イベントのために、Oracle RACクラスタのインスタンスで利用できるサービスのない接続が含まれます。流用された接続および使用可能な接続のうち失効しているものが検出され、それらのネットワーク接続が切断されてプールから削除されます。これらの削除された接続は、プールで置き換えられません。かわりに、アプリケーションでは接続を使用して処理を実行する前に、接続を再試行する必要があります。


注意:

流用された接続は、計画外停止のシナリオの際、ただちに中断およびクローズされます。実行中のトランザクションは、即座に例外を受け取ります。

計画停止のシナリオ

FCFでは、Oracle RACサービスを適切に停止できる計画停止のシナリオをサポートします。このシナリオの場合、失効している流用された接続にはマークが付けられ、プールに返された後にのみ中断および削除が行われます。実行中のトランザクションに変化はなく、完了するまで続行されます。

計画外停止と計画停止のシナリオの主な違いは、流用された接続の処理方法です。プール内でアイドル状態の(流用されていない)失効した接続は、計画外停止のシナリオと同じ方法で削除されます。

Oracle Database 12cリリース1 (12.1.0.2)以降、JDBCのUCPは計画停止Oracle RACインスタンスからの適切な接続の排出をサポートします。影響を受ける、流用されている接続は、プールに戻るとすぐに削除されるのではなく、猶予期間にスムーズに削除されます。これはサービスの再配置中のスループットの影響とログオン・ストームを避ける際に役立ちます。


関連項目:

JDBCのUCPを使用した適切な接続の排出の詳細は、「高速接続フェイルオーバーの有効化」を参照してください。

Oracle RACインスタンスの再追加および新しいインスタンスのシナリオ

FCFでは、Oracle RACクラスタが関係するサービスを提供するインスタンスを追加するシナリオをサポートします。インスタンスは、クラスタにとって新しいものでも、停止イベント後に再起動されたものでもかまいません。どちらの場合でも、UCP for JDBCは新しいインスタンスを認識し、必要に応じてノードへの接続を作成します。

高速接続フェイルオーバーについて

高速接続フェイルオーバーを使用可能に設定すると、メカニズムは自動なので、アプリケーションによる操作は必要ありません。この項では、次の項の接続フェイルオーバーがアプリケーションに提示される仕組みと、アプリケーションによるリカバリの手順を説明します。

アプリケーションによる認識

Oracle RACサービス障害がJDBCアプリケーションに伝播される前に、データベースはローカル・トランザクションをすでにロールバックしています。次に、キャッシュ・マネージャがすべての無効な接続をクリーン・アップします。無効な接続を保持しているアプリケーションがその接続を通して機能しようとすると、「SQLException, ORA-17008, クローズされた接続です。」を受け取ることがあります。

アプリケーションが「クローズされた接続です。」エラー・メッセージを受信した場合、次のことを実行する必要があります。

  1. 接続要求を再試行します。古い接続はオープンでないため、これは必須です。

  2. トランザクションを再実行します。接続がクローズする前に実行された作業はすべて失われています。


注意:

アプリケーションによってトランザクションをロールバックしないでください。アプリケーションが例外を受信した時点で、トランザクションはすでにデータベースでロールバックされています。

実行される処理

高速接続フェイルオーバーでは、キャッシュ内の各接続はサービス、インスタンス、データベースおよびホスト名へのマッピングを維持します。

データベースがOracle RACイベントを生成すると、そのイベントはJDBCが稼働中であるJVMに転送されます。JVM内のデーモン・スレッドがOracle RACイベントを受信し、それをConnection Cache Managerに転送します。次に、Connection Cache ManagerはOracle RACイベントの影響を受けるアプリケーションに対してSQL例外を発行します。

一般的なフェイルオーバーの例を次に示します。

  1. データベース・インスタンスで障害が発生し、キャッシュ内にいくつかの失効した接続が残ります。

  2. データベース内のOracle RACメカニズムがOracle RACイベントを生成し、そのイベントはJDBCが含まれているJVMに送信されます。

  3. JVM内のデーモン・スレッドはOracle RACイベントの影響を受けるすべての接続を検出し、SQL例外によって接続がクローズされたことを通知し、オープンなトランザクションがあればすべてロールバックします。

  4. 各接続はSQL例外を受信し、再試行します。

高速接続フェイルオーバーの前提条件

高速接続フェイルオーバーを使用するには、次の前提条件を満たしている必要があります。

  • ユニバーサル接続プールが有効です。

    高速接続フェイルオーバーは、JDBC接続キャッシュ・メカニズムとの組合せで動作します。これにより、アプリケーションは接続を管理して高可用性を確保します。

  • アプリケーションがデータベースへの接続にサービス名を使用していること

    アプリケーションはサービス識別子を使用できません。

  • 基礎となるデータベースには、Oracle Database 12cリリース1 (12.1) Real Application Clusters(Oracle RAC)機能、または単一インスタンス・データベースかOracle RACのいずれかで構成されたOracle Data Guardがあること

    フェイルオーバー・イベントが伝播しないと、接続フェイルオーバーは発生しません。

  • JDBCが稼働しているノードでOracle Notification Service(ONS)が構成されており、使用可能であること

    JDBCは、データベース・イベントの伝播およびJDBCへのイベントの通知を行うために、ONSに依存しています。

  • JDBCインスタンスが稼働しているJava仮想マシン(JVM)で、oracle.ons.oraclehomeORACLE_HOMEを指すように設定されていること

高速接続フェイルオーバーの構成の例

次の例では、FCF機能を使用する接続プールを示します。FCFは、プール対応のデータソースを使用して構成されます。この例では、FCFの有効化、Oracle Notification Service(ONS)の構成および接続URLの構成が行われます。これらの項目については、例の後で説明します。

例8-1 高速接続フェイルオーバーの構成の例

PoolDataSource  pds = PoolDataSourceFactory.getPoolDataSource();

pds.setConnectionPoolName("FCFSamplePool");
pds.setFastConnectionFailoverEnabled(true);
pds.setONSConfiguration("nodes=racnode1:4200,racnode2:4200\nwalletfile=
/oracle11/onswalletfile"); pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");pds.setURL("jdbc:oracle:thin@(DESCRIPTION= "+ "(LOAD_BALANCE=on)"+ "(ADDRESS=(PROTOCOL=TCP)(HOST=racnode1) (PORT=1521))"+ "(ADDRESS=(PROTOCOL=TCP)(HOST=racnode2) (PORT=1521))"+ "(CONNECT_DATA=(SERVICE_NAME=service_name)))"); ...

通常、oracle.ucp.jdbc.ValidConnectionインタフェースのisValidメソッドはFCF機能とともに使用され、Oracle RAC停止イベントによってSQL例外がスローされた後でも流用された接続が使用可能かどうかをチェックするために使用されます。次に例を示します。

try {  conn = pds.getConnection;  ...}catch (SQLException sqlexc)
{
   if (conn == null || !((ValidConnection) conn).isValid())
        
   // take the appropriate action
   
...
conn.close();
}

ValidConnectionインタフェースの詳細は、「接続の有効性のチェック」を参照してください。

高速接続フェイルオーバーの有効化

FCFプール・プロパティを使用して、FCFを有効または無効にします。デフォルトではFCFは無効になっています。次の例では、例8-1に示されているFCFの有効化を示します。

pds.setFastConnectionFailoverEnabled(true);

注意:

Oracle Database 12cリリース1 (12.1.0.2)以降、JDBCのUCPはoracle.ucp.PlannedDrainingPeriodシステム・プロパティをサポートします。計画停止により影響を受ける、流用されている接続をプールがスムーズに排出する猶予期間を指定します(整数の秒数)。同じデータベース・サービスが、停止中のものとは別のインスタンスで使用可能になると、排出が開始されます。

このプロパティが設定されていない、または0に設定されている場合、プールは影響を受ける、流用されている接続がプールに戻されるとすぐにクローズします。


高速接続フェイルオーバーのステータスの問合せ

アプリケーションは、高速接続フェイルオーバーが使用可能になっているかどうかを判断するために、OracleDataSource.getFastConnectionFailoverEnabledをコールします。フェイルオーバーが使用可能な場合はtrueが、それ以外の場合はfalseが戻されます。


注意:

FCFは、実行時接続ロード・バランシングおよび接続アフィニティを使用する場合にも有効にする必要があります。これらの機能については、この章で後述します。

ONSの構成

FCFは、Oracle Notification Service (ONS)を利用して、接続プールとOracle RACデータベース間でデータベース・イベントを伝播します。接続プールは、実行時にONS環境を設定できる必要があります。ONS(ons.jar)はOracle Clientソフトウェアに同梱されています。ONSは、リモート構成またはクライアント側のONSデーモン構成を使用して構成できます。リモート構成は、スタンドアロンのクライアント・アプリケーションに適した構成です。この項の内容は、次のとおりです。

ONS構成ファイルの概要

ONS構成は、ONSの構成ファイルORACLE_HOME/opmn/conf/ons.configによって制御されます。このファイルは、ONSデーモンに動作方法を指示します。ons.config内の構成情報は、単純な名前と値のペアで定義されています。

ons.configファイルのパラメータには必須のものとオプションのものがあります。表8-2は必須のONS構成パラメータを示し、表8-3はオプションのONS構成パラメータを示します。ons.configファイルの更新後に、ONSをリフレッシュする必要があります。

表8-2 必須のONS構成パラメータ

パラメータ 説明

localport

ローカル・クライアントと通信するために、ONSがローカル・ホスト・インタフェースでバインドするポートを指定します。

たとえば、localport=4100です。

remoteport

他のONSデーモンと通信するために、ONSがすべてのインタフェースでバインドするポートを指定します。

たとえば、remoteport=4200です。

nodes

通信相手である他のONSデーモンのリストを指定します。ノード値は、ホスト名またはIPアドレスにポートを追加したもののカンマ区切りのリストとして指定します。提供するポート値は、各ONSインスタンスがリスニングしているリモート・ポートです。全ノードで同一のファイルを維持するために、現行のONSノードのhost:portをノード・リストに含めることも可能です。リストの読取り時には、これは無視されます。

たとえば、nodes=myhost.example.com:4200,123.123.123.123:4200です。

ノード行にリスト表示されているノードは、Oracle RACインスタンス内の個別のノードに対応します。ノードをリストに含めることにより、中間層ノードはOracle RACノードと確実に通信できます。最低1つの中間層ノードと、1つのOracle RACインスタンス内のノードを構成しないと、互いが認識されません。それぞれの側で最低1つのノードが互いを認識していると、すべてのノードが認識されます。各Oracle RACノードのONS構成ファイルでは、すべての単一クラスタおよび中間層ノードをリスト表示する必要はありません。特に、1つのONS構成ファイル・クラスタ・ノードが中間層を認識している場合、クラスタ内のすべてのノードが中間層を認識しています。


表8-3 オプションのONS構成パラメータ

パラメータ 説明

logcomp

記録するONSコンポーネントを指定します。書式は次のとおりです。

<component>[<subcomponent>,...];<component>[<subcomponent>,...];...

サブコンポーネントを指定する必要がない場合、コンポーネント名の後にカッコ([])を含まないでください。サブコンポーネントからメッセージを除外するには、サブコンポーネント名の前に感嘆符(!)が必要です。たとえば、topologyサブコンポーネントからメッセージを除外するには、次の書式を使用します。

[all,!topology]

メッセージを除外するサブコンポーネントを指定する前に、サブコンポーネントがメッセージを含むことを最初に確認する必要があります。

次に、コンポーネントの有効な値を示します。

  • internal

  • ons

internalとしてコンポーネントを指定する場合、サブコンポーネントの有効な値はありません。onsとしてコンポーネントを指定する場合、サブコンポーネントの次の値を指定できます。

  • all: すべてのメッセージを指定します

  • ons: ONSローカル情報

  • listener: ONSリスナー情報

  • discover: ONS検出(サーバーまたはマルチキャスト)情報

  • servers: クラスタに接続されていて現在稼働中のONSリモート・サーバー

  • topology: ONSの現在のクラスタ全体のサーバー接続トポロジ

  • server: ONSリモート・サーバー接続情報

  • client: ONSクライアント接続情報

  • connect: ONSの全般的な接続情報

  • subscribe: ONSクライアント・サブスクリプション情報

  • message: ONSの通知の受信および処理情報

  • deliver: ONS通知配信情報

  • special: ONSの特殊な通知処理

  • internal: ONS内部リソース情報

  • secure: ONSのSSL操作情報

  • workers: ONSワーカー・スレッド

次の例は、secureサブコンポーネントを除くonsの下のすべてのサブコンポーネントのメッセージを記録する場合を示します。

logcomp=ons[all,!secure]

logfile

ONSがメッセージの記録に使用するログ・ファイルを指定します。ログ・ファイルのデフォルト値は$ORACLE_HOME/opmn/logs/ons.logです。

たとえば、logfile=/private/oraclehome/opmn/logs/myons.logです。

walletfile

Oracle Secure Sockets Layer(SSL)がSSL証明書の格納に使用するウォレット・ファイルを指定します。ONSでウォレット・ファイルが指定されると、他のONSインスタンスとの通信時にSSLを使用し、接続しようとするすべてのONSインスタンスからSSL証明書の認証を要求します。つまり、1つのONSインスタンスでSSLを有効にする場合、このインスタンスと接続されているすべてのインスタンスでも有効にする必要があります。この値は、ewallet.p12ファイルが存在するディレクトリを指すように設定します。

たとえば、walletfile=/private/oraclehome/opmn/conf/ssl.wlt/defaultです。

useocr

ONSがすべてのOracle RACノードおよびポート番号を、ONS構成ファイルでなくOracle Cluster Registry (OCR)に格納するかどうかを示す、サーバー側での使用のために予約されている値を指定します。useocr=onの場合、すべてのOracle RACノードおよびポート番号がOracle Cluster Registry (OCR)に格納されます。

このオプションは、クライアント側では使用しないでください。

allowgroup

localportに接続するユーザー・グループを示すONS設定を指定します。trueに設定すると、ONSは同じOSグループ内のユーザーにローカル・ポートへの接続を許可します。falseに設定すると、ONSはONSデーモンを実行している同じユーザーにローカル・ポートのアクセスを許可します。このパラメータのデフォルト値はfalseです。リモートONS構成を使用する場合、このパラメータを設定する必要はありません。


ons.configファイルでは、ナンバー記号(#)で始まる行に空白行およびコメントを使用できます。

リモート構成

UCP for JDBCでは、ONSConfigurationプール・プロパティを使用したONSのリモート構成をサポートします。ONSConfigurationプール・プロパティ値は、ons.configファイルの内容に酷似している文字列です。この文字列は、改行文字(\n)で区切られたname=valueペアのリストからなります。このプール・プロパティは、次の2つの方法で設定できます。

  • 名前は、nodeswalletfilewalletpasswordのいずれかです。パラメータ文字列では、少なくともONS構成のnodes属性をカンマ区切りのhost:portペアのリストとして指定する必要があります。walletfile属性がOracleウォレット・ファイルとして指定される場合は、SSLが使用されます。

    次の例では、例8-1に示されているONS構成文字列を示します。

    ...
    pds.setONSConfiguration("nodes=racnode1:4200,racnode2:4200\nwalletfile=/oracle11/onswalletfile");
    ...
    
  • 名前は、propertiesfileにしかできません。この値は、ONS固有のJavaプロパティ・ファイルの場所です。このファイルには、oracle.ons.nodesプロパティと、次のONS Javaプロパティの一方または両方が含まれている必要があります。

    • oracle.ons.walletfile

    • oracle.ons.walletpassword

      次の例では、このようなONSConfiguration文字列を示します。

      pds.setONSConfiguration("propertiesfile=/usr/ons/ons.properties");
      

      Javaプロパティ・ファイルons.propertiesの内容の例を次に示します。

      oracle.ons.nodes=racnode1:4200,racnode2:4200
      oracle.ons.walletfile=/oracle11/onswalletfile
      

注意:

構成文字列内のパラメータは、Oracle RAC Databaseのパラメータと一致する必要があります。さらに、Oracle Application Serverを使用する場合、サーバーに適用可能な手順を使用してONSを構成する必要があります。

スタンドアロンJavaアプリケーションの場合、setONSConfigurationメソッドを使用してONSを構成する必要があります。ただし、アプリケーションが次の要件を満たす場合、FCFを有効化するために、setONSConfigurationメソッドを呼び出す必要はなくなります。

  • アプリケーションがOracle Database 12cリリース1 (12.1) UCPおよびOracle RAC Database 12cリリース1 (12.1)を使用している

  • アプリケーションでONSウォレットまたはキーストアを必要としない


クライアント側のデーモン構成

クライアント側のONSデーモン構成は、Oracle Application Serverなどの中間層サーバーで実行される典型的なアプリケーションです。このシナリオでのクライアントは、ons.configファイルを更新することでONSを直接構成します。ファイルの場所は、プラットフォームによって異なります。例8-2では、例8-1用のons.configファイルを示します。


注意:

クライアント側のONSデーモン構成では、接続プールを起動するオペレーティング・システム(OS)ユーザーと、クライアント側のデーモンを起動するOSユーザーが異なる場合、どちらのユーザーも同じOSグループに属する必要があります。また、allowgroupパラメータの値は、ons.configファイルでtrueに設定する必要があります。

例8-2 サンプルのons.configファイルの例

# This is an example ons.config file
#
# The first three values are required
localport=4100
remoteport=4200
nodes=racnode1.example.com:4200,racnode2.example.com:4200

ONSを構成した後、onsctlコマンドでONSデーモンを起動します。ONSデーモンが常に実行中であることを確認する必要があります

onsctlコマンドの使用

構成後、ORACLE_HOME/opmn/bin/onsctlを使用してONSデーモンの起動、停止、再構成および監視を行います。表8-4は、onsctlでサポートされているコマンドのサマリーを示しています。

表8-4 onsctlコマンド

コマンド 効果 出力

start

ONSデーモンを起動

onsctl: ons started

stop

ONSデーモンを停止

onsctl: shutting down ons daemon...

ping

ONSデーモンが稼働中であるかどうかを検証

ons is running ...

reconfig

ONSデーモンをシャットダウンせずにONS構成のリロードをトリガー


help

onsctlのヘルプ・サマリー・メッセージを出力


detailed

onsctlの詳細ヘルプ・メッセージを出力




関連項目:

『Oracle Real Application Clusters管理およびデプロイメント・ガイド』


注意:

  • JDBCインスタンスが実行されているJava仮想マシン(JVM)では、アプリケーションの起動前にoracle.ons.oraclehomeシステム・プロパティをORACLE_HOMEの場所に設定する必要があります。次に例を示します。

    java -Doracle.ons.oraclehome=$ORACLE_HOME ...
    
  • UCPに対してはONSのリモート構成をお薦めします。



注意:

Oracle RAC 12.1.0.2.0では、デフォルトで、サーバーのインストールにwalletfile ONSパラメータの値の設定が必要で、すべてのONS接続にSSLの使用が強制されます。

ONSリモート構成文字列またはローカル構成ファイルのwalletfileパラメータをすでに使用しているUCPアプリケーションがある場合、要件は、同じトポロジでは、クライアント側のウォレット・ファイルにサーバー側のウォレット・ファイルと同じ内容が含まれる必要があることだけです。サーバー側ファイルのコピーを作成し、クライアント側で使用できるようにすることができます。

walletfileパラメータを設定せずにOracle RAC機能を使用しているUCPアプリケーションの場合、次のいずれかを実行する必要があります。

  • 例8-1に示すように、walletfileパラメータの設定をONSリモート構成文字列またはローカル構成ファイルに追加します。同じトポロジでは、クライアント側のウォレット・ファイルには、Oracle RACサーバー側のウォレット・ファイルと同じ内容が含まれる必要があることに注意してください。

  • 次のコマンドを実行してwalletfileパラメータ設定をクライアントおよびサーバーのONS構成文字列およびローカル構成ファイルから削除します。

    srvctl modify nodeapps -clientdata
    

セキュアな通信のために、Oracle RAC 12.1.0.2.0を最初にインストールする、またはパッチを適用すると、Oracle RAC 12.1.xのONS自動構成は機能しなくなります。かわりに、アプリケーションは明示的ONS構成(リモートまたはローカル)を使用し、前述のいずれかの変更を行う必要があります。


接続URLの構成

コネクション・ファクトリの接続URLでは、FCFを使用する際、サービス名の構文を使用する必要があります。サービス名は、接続プールをサービスにマップするために使用されます。また、ファクトリ・クラスはOracleファクトリ・クラスである必要があります。次の例では、例8-1に示されている接続URLの構成を示します。

...
pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");
pds.setURL("jdbc:oracle:thin@//host:port/service_name");
...

注意:

FCFが有効である場合、サービス識別子(SID)を接続URLに指定すると、例外がスローされます。

次の例では、Oracle RACデータベースに接続する際の有効な接続URLの構文を示します。Oracle JDBC ThinドライバとOracle OCIドライバの両方の例が含まれています。URLを使用してOracle RACノード間のロード・バランシングを明示的に有効にできることに注意してください。

有効な接続URLの使用方法

pds.setURL("jdbc:oracle:thin@//host:port/service_name"); 

pds.setURL("jdbc:oracle:thin@//cluster-alias:port/service_name"); 

pds.setURL("jdbc:oracle:thin:@(DESCRIPTION= "+
   "(LOAD_BALANCE=on)"+
   "(ADDRESS=(PROTOCOL=TCP)(HOST=host1)(PORT=1521))"+
   "(ADDRESS=(PROTOCOL=TCP)(HOST=host2)(PORT=1521))"+
   "(CONNECT_DATA=(SERVICE_NAME=service_name)))");

pds.setURL("jdbc:oracle:thin:@(DESCRIPTION= "+
   "(ADDRESS=(PROTOCOL=TCP)(HOST=cluster_alias) (PORT=1521)) "+
   "(CONNECT_DATA=(SERVICE_NAME=service_name)))");

pds.setURL("jdbc:oracle:oci:@TNS_ALIAS");

pds.setURL("jdbc:oracle:oci:@(DESCRIPTION= "+
   "(LOAD_BALANCE=on) "+
   "(ADDRESS=(PROTOCOL=TCP)(HOST=host1) (PORT=1521)) "+
   "(ADDRESS=(PROTOCOL=TCP)(HOST=host2)(PORT=1521)) "+
   "(CONNECT_DATA=(SERVICE_NAME=service_name)))"); 

pds.setURL("jdbc:oracle:oci:@(DESCRIPTION= "+
   "(ADDRESS=(PROTOCOL=TCP)(HOST=cluster_alias) (PORT=1521)) "+
   "(CONNECT_DATA=(SERVICE_NAME=service_name)))");

実行時接続ロード・バランシングの使用方法

この項では、次の項目について説明します。

実行時接続ロード・バランシングの概要

Oracle Real Application Clusters環境では、接続は関連サービスを提供するインスタンスに属しています。すべてのインスタンスが等しく実行され、接続がキャッシュからランダムに取り出されるのが最も理想的です。しかし、あるインスタンスのパフォーマンスが他のインスタンスを上回る場合、接続をランダムに選択すると効率が悪くなります。実行時接続ロード・バランシング機能を使用すると、最適なパフォーマンスを提供するインスタンスに作業要求がルーティングされるため、作業を再配置する必要が最小限になります。

UCP JDBC接続プールは、Oracle RACデータベースが提供するロード・バランシング機能を利用します。実行時接続ロード・バランシングには、Oracle JDBCドライバおよびOracle RACデータベースを使用する必要があります。Oracle RACデータベースの設定の詳細は、『Oracle Real Application Clusters管理およびデプロイメント・ガイド』を参照するか、Oracleデータベース管理者に問い合せてください。

実行時接続ロード・バランシングは、次の場合に便利です。

  • 従来のワークロード・バランシングが最適でない場合

  • クラスタ・データベース内のリソースを最大限に利用するようにリクエストをルーティングする必要がある場合

  • クラスタ内の許容量が異なり、時間とともに変化することが予想される場合

  • 低速なノード、ハングアップしたノードおよびデッド・ノードに作業を送信しないようにする要件が必須である場合

UCP for JDBCは、Oracle RACロード・バランシング・アドバイザを使用します。このアドバイザを使用して、Oracle RACインスタンス間の作業のバランスをとり、最高のパフォーマンスを発揮するインスタンスを特定します。アプリケーションは、最高のパフォーマンスを発揮するインスタンスから透過的に接続を受け取ります。速度が落ちたインスタンス、レスポンスを返さないインスタンスまたは障害が発生したインスタンスからは、ただちに接続リクエストが変更されます。

実行時接続ロード・バランシングには次の利点があります。

  • 高いパフォーマンスおよびスケーラビリティのためにプールされた接続を管理します。

  • データベース・インスタンスにルーティングする作業の比率の推奨値を継続的に受け取ります。

  • CPU性能またはレスポンス時間など、様々なバックエンド・ノードの能力に基づいて作業の分散を調整します。

  • クラスタ構成の変更、アプリケーション・ワークロード、過度に使用されているノード、ハングアップにすばやく対応します。

  • Oracle RACロード・バランシング・アドバイザからメトリックを受け取ります。パフォーマンスが良好なインスタンスへの接続が最もよく使用されます。パフォーマンスが低いインスタンスへの新しい未使用の接続は、時間とともに使用されなくなります。分散メトリックを受け取らない場合、接続はランダムに選択されます。

実行時接続ロード・バランシングの設定

実行時接続ロード・バランシングには、FCFが有効であり、適切に構成されていることが必要です。FCFの設定の詳細は、「高速接続フェイルオーバーの使用方法」を参照してください。

また、ロード・バランシングを有効にする各サービスのサービス・レベルの目標を使用してOracle RACロード・バランシング・アドバイザを構成する必要があります。

  • サービス目標は、次のいずれかに設定する必要があります。

    • DBMS_SERVICE.SERVICE_TIME

    • DBMS_SERVICE.THROUGHPUT

    サービス目標はgoalパラメータを使用して、接続バランシング目標はclb_goalパラメータを使用して設定できます。

  • 接続バランシング目標はSHORTに設定する必要があります。次に例を示します。

    EXECUTE DBMS_SERVICE.MODIFY_SERVICE (service_name => 'sjob' -, goal => 
       DBMS_SERVICE.GOAL_THROUGHPUT -, clb_goal => DBMS_SERVICE.CLB_GOAL_SHORT);
    

    または

    EXECUTE DBMS_SERVICE.MODIFY_SERVICE (service_name => 'sjob' -, goal => 
       DBMS_SERVICE.GOAL_SERVICE_TIME -, clb_goal => DBMS_SERVICE.CLB_GOAL_SHORT);
    

DBMS_SERVICE.create_serviceプロシージャをコールして、接続バランシング目標も設定できます。


注意:

接続バランシング目標は、LONGに設定することができます。ただし、これはクローズされたワークロードに対して、つまり完了した作業の割合と新しく始める作業の割合が等しいときに、最も有効です。


関連項目:

『Oracle Real Application Clusters管理およびデプロイメント・ガイド』

接続アフィニティの使用方法

この項では、次の項目について説明します。

接続アフィニティの概要

UCP JDBC接続プールは、Oracle RACデータベースが提供するアフィニティ機能を利用します。接続アフィニティには、Oracle JDBCドライバとリリース11.1.0.6以上のOracle RACデータベースを使用する必要があります。

接続アフィニティは、特定のOracle RACインスタンスに送られる接続を接続プールで選択できるようにするパフォーマンス機能です。プールが実行時接続ロード・バランシング(構成されている場合)を使用し、Oracle RACインスタンスを選択して最初の接続を作成すると、後続の接続は同じインスタンスへのアフィニティを使用して作成されます。


関連項目:


UCP JDBC接続プールは、次の2つのタイプの接続アフィニティをサポートします。

トランザクションベースのアフィニティ

トランザクションベースのアフィニティは、クライアント・アプリケーションまたは障害イベントによって解放できるOracle RACインスタンスへのアフィニティです。通常、アプリケーションがこのタイプのアフィニティを使用するのは、Oracle RACインスタンスへの存続期間が長いアフィニティが望ましい場合、または新しいOracle RACインスタンスへのリダイレクトのコストが(パフォーマンスの点で)高い場合です。分散トランザクションは、トランザクションベースのアフィニティのよい例です。分散トランザクションに参加しているXA接続は、トランザクション中にOracle RACインスタンスへのアフィニティを保持します。この場合、分散トランザクション中に接続が別のOracle RACインスタンスにリダイレクトされると、アプリケーションで非常に高いパフォーマンス・コストが発生します。

Webセッション・アフィニティ

Webセッション・アフィニティは、インスタンス、クライアント・アプリケーションまたは障害イベントによって解放できるOracle RACインスタンスへのアフィニティです。Oracle RACインスタンスは、インスタンスでアフィニティが有効か無効かに関係なく、ヒントを使用して接続プールと通信します。Oracle RACインスタンスは、パフォーマンスやロードなどの様々な要素に基づいてアフィニティを無効にできます。Oracle RACインスタンスでアフィニティがサポートされなくなると、プール内の接続は新しいインスタンスを使用するためにリフレッシュされ、アフィニティが再設定されます。

通常、アプリケーションがこのタイプのアフィニティを使用するのは、Oracle RACインスタンスへの存続期間が短いアフィニティが望ましい場合、または新しいOracle RACインスタンスへのリダイレクトのコストが(パフォーマンスの点で)最も低い場合です。たとえば、メール・クライアント・セッションでは、Oracle RACインスタンスへのWebセッション・アフィニティを使用してパフォーマンスを向上させますが、接続が別のインスタンスにリダイレクトされても相対的に影響を受けません。

接続アフィニティの設定

次の手順を実行して、接続アフィニティを設定します。


注意:

トランザクションベースのアフィニティは、アプリケーション/中間層およびUCP for JDBC間で厳密に有効範囲が指定されます。したがって、トランザクションベースのアフィニティは、setFastConnectionFailoverEnabledプロパティのtrueへの設定のみが必要であり、完全なFCF構成は必要ありません。

また、トランザクションベースのアフィニティは、技術的には実行時接続ロード・バランシングを必要としません。しかし、パフォーマンスの向上に役立つため、通常は有効にしておきます。実行時接続ロードバランシングが無効である場合、接続プールはランダムに接続を選択します。


この項では、次の項目について説明します。

接続アフィニティ・コールバックの作成

接続アフィニティには、コールバックを使用する必要があります。コールバックは、oracle.ucpパッケージにあるConnectionAffinityCallbackインタフェースの実装です。コールバックは、接続アフィニティ・コンテキストを設定および取得するために接続プールで使用されます。また、アフィニティ・ポリシー・タイプ(トランザクションベースまたはWebセッション)の設定にも使用されます。

次の例では、コールバックの実装でのアフィニティ・ポリシーの設定を示します。また、アフィニティ・コンテキストの手動による設定も示します。通常、接続プールがアプリケーション内部でアフィニティ・コンテキストを設定します。しかし、アフィニティの動作をカスタマイズしたりアフィニティ・コンテキストを直接制御するアプリケーションのために、アフィニティ・コンテキストを手動で設定する機能があります。

public class AffinityCallbackSample
   implements ConnectionAffinityCallback {
   
   Object appAffinityContext = null;
   ConnectionAffinityCallback.AffinityPolicy affinityPolicy =
   ConnectionAffinityCallback.AffinityPolicy.TRANSACTION_BASED_AFFINITY;
   
   //For Web session affinity, use WEBSESSION_BASED_AFFINITY;
   
   public void setAffinityPolicy(AffinityPolicy policy)
   {
      affinityPolicy = policy;
   }
   
   public AffinityPolicy getAffinityPolicy()
   {
      return affinityPolicy;
   }
   
   public boolean setConnectionAffinityContext(Object affCxt)
   {
      synchronized (lockObj)
      {
         appAffinityContext = affCxt;
      }
      return true;
   }
   
   public Object getConnectionAffinityContext()
   {
      synchronized (lockObj)
      {
         return appAffinityContext;
      }
   }
}

接続アフィニティ・コールバックの登録

接続アフィニティ・コールバックは、registerConnectionAffinityCallbackメソッドを使用して接続プールに登録されます。コールバックは、接続プールの作成時に登録されます。接続プールごとに登録できるコールバックは1つのみです。

次の例では、接続アフィニティ・コールバックの実装の登録を示します。

ConnectionAffinityCallback callback = new MyCallback();

PoolDataSource  pds = PoolDataSourceFactory.getPoolDataSource();

pds.setConnectionPoolName("AffinitySamplePool");
pds.registerConnectionAffinityCallback(callback);
...

接続アフィニティ・コールバックの削除

接続アフィニティ・コールバックは、removeConnectionAffinityCallbackメソッドを使用して接続プールから削除されます。次に例を示します。

PoolDataSource  pds = PoolDataSourceFactory.getPoolDataSource();

pds.setConnectionPoolName("AffinitySamplePool");
pds.removeConnectionAffinityCallback();
...

厳密なアフィニティ・モード

デフォルトでは、アフィニティはヒントにすぎません。必要なインスタンスの接続が見つからない場合、接続プールは、接続の新しいOracle RACインスタンスを選択します。厳密なアフィニティ・モードをオンに切り替えて、この動作を変更できます。必要なインスタンスの接続が見つからない場合、厳密なアフィニティ・モードはUCP例外をスローします。

次のプール・プロパティを使用して、厳密なアフィニティ・モードをオンに切り替えます。

  • useStrictWebSessionAffinityプロパティ

    厳密なWebセッション・アフィニティ・モードをオンまたはオフに切り替えるには、useStrictWebSessionAffinityプロパティをtrueまたはfalseに設定します。

  • useStrictXAAffinityプロパティ

    厳密なトランザクションベースのアフィニティ・モードをオンまたはオフに切り替えるには、useStrictXAAffinityプロパティをtrueまたはfalseに設定します。

UniversalConnectionPoolMBeanを使用して、これらのプロパティを処理できます。

グローバル・データ・サービスの使用方法

この項では、ユニバーサル接続プールで使用できる新しいグローバル・データ・サービス(GDS)機能について説明します。

グローバル・データ・サービスの概要

グローバル・データ・サービス(GDS)は、Oracle Database 12cリリース1 (12.1)に導入された新しい機能です。この機能により、Oracle RACでのみ使用できた高速接続フェイルオーバー機能、実行時接続ロード・バランシング機能および接続アフィニティ機能は、共通サービスを提供する一連の複製データベースにまで拡張されています。

一連のデータベースには、Data Guard、GoldenGate、他のレプリケーション・テクノロジによって相互接続されたOracle RACデータベースや単一インスタンスのOracleデータベースが含まれます。複数のデータベースによって提供できるデータベース・サービスは、グローバル・サービスと呼ばれるため、単一データベースによってのみ提供できる従来のサービスとは区別できます。この組合せにより、このグローバルに分散された構成内の任意の場所にサービスをデプロイできるため、ロード・バランシング、高可用性、データベース・アフィニティなどがサポートされます。


関連項目:

Oracle Database Global Data Services概要および管理ガイド

GDSを使用するアプリケーションの構成設定

UCPは、Oracle RACのローカル・サービスに接続するのと同じ方法でグローバル・データ・サービスに接続します。接続文字列のサービス名は、グローバル・サービスの名前である必要があります。エンドポイントは、データベースのローカル・リスナー、リモート・リスナーまたはSCANリスナーのエンドポイントではなく、GDSリスナーのエンドポイントである必要があります。

クライアントは、接続文字列のREGIONパラメータでリージョンを指定する必要があります。これは、新しいGDSに関する要件です。GDSの場合、実行時ロード・バランシング・アドバイザが特定のリージョン用にカスタマイズされるため、リージョン名は必須です。一般的な接続文字列の例を次に示します。

(DESCRIPTION=
  (ADDRESS=(GDS_protocol_address_information))
  (CONNECT_DATA=
   (SERVICE_NAME=global_service_name)
   (REGION=region_name)))

ローカル・サービスと同様、UCPは、リスナー・フェイルオーバーまたはロード・バランシング(あるいはその両方)用に複数のGDSリスナーを同じ接続文字列に指定できます。


注意:

SCANはGDSリスナーに対してサポートされていないため、各リスナーのエンドポイントを指定する必要があります。

(DESCRIPTION=
  (ADDRESS_LIST=
    (LOAD_BALANCE=ON)
    (FAILOVER=ON)
    (ADDRESS=(GDS_protocol_address_information))
    (ADDRESS=(GDS_protocol_address_information)))
  (CONNECT_DATA=
   (SERVICE_NAME=global_service_name)
   (REGION=region_name)))

ローカル・リージョンのグローバル・サービス・マネージャのみがクライアント接続文字列に指定されている場合、REGIONパラメータはオプションです。これは、GDS構成に1つのリージョンのみが存在する場合か、または複数のリージョンがある場合に該当する可能性があります。ただし、単一データベースで動作するよう設計されている既存のクライアントの接続文字列を変更することはできません。REGIONパラメータが指定されていない場合、クライアントのリージョンは、グローバル・サービスに接続するために使用されるグローバル・サービス・マネージャのリージョンであると想定されます。


注意:

REGIONパラメータが接続文字列に指定されないかぎり、単一のリージョンを持つGDS構成とともに12c以前のシンJDBCクライアントのみ使用できます。

前の例のGDSリスナーはすべて、UCPが実行されている同じリージョン(ローカル・リージョン)に属しています。高可用性を提供するため、ローカル・リージョンのすべてのGDSを使用できない場合、追加のADDRESS_LIST記述子のバディ・リージョンのGDSリスナーを指定できます。

(DESCRIPTION=
  (FAILOVER=on)
  (ADDRESS_LIST=
    (LOAD_BALANCE=ON)
    (ADDRESS=(global_protocol_address_information))
    (ADDRESS=(global_protocol_address_information)))
  (ADDRESS_LIST=
    (LOAD_BALANCE=ON)
    (ADDRESS=(global_protocol_address_information))
    (ADDRESS=(global_protocol_address_information)))
  (CONNECT_DATA=
   (SERVICE_NAME=global_service_name)
   (REGION=region_name)))

UCPリージョン用に最適にカスタマイズされるONS接続情報をUCPがGDSから自動的に取得するため、手動ONS構成は必要ありません。


注意:

  • GDSに対して自動ONS構成を有効にするには、UCPで高速接続フェイルオーバー(FCF)を有効にする必要があります。

  • 自動ONS構成は、Oracle GDSおよびOracle RACでのみ動作します。単一インスタンスのOracle Databaseで動作しません。

    自動ONS構成は、ONSウォレットまたはキーストア・パラメータをサポートしません。アプリケーションがこれらのパラメータのいずれかを必要とする場合、次のいずれかの方法で明示的にONSを構成する必要があります。

    • PoolDataSource.setONSConfiguration(String)メソッドのコール

    • ローカルのONS構成ファイルのONSウォレットまたはキーストア・パラメータの追加