Oracle® Universal Connection Pool for JDBC

開発者ガイド

12cリリース1 (12.1)

B71309-02(原本部品番号:E49541-01)

2014年7月

このガイドでは、Oracle Universal Connection Pool APIの使用方法について説明します。APIはJDBCドライバ・アグノスティックです。

Oracle Universal Connection Pool for JDBC開発者ガイド, 12cリリース1 (12.1)

B71309-02

Copyright © 1999, 2014, Oracle and/or its affiliates.All rights reserved.

原本著者: Tulika Das

原本協力者:  Joseph Ruzzi

原本協力者:  Oracle Database 12cのドキュメントを、本リリースに携わった全員にとって創造の源となったMark Townsendに捧げます。

原本協力者:  Rajkumar Irudayaraj、Tong Zhou、Yuri Dolgov、Paul Lo、Kuassi Mensah、Frances Zhao

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

このソフトウェアまたは関連ドキュメントが、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供される場合は、次のNoticeが適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

このソフトウェアまたはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアまたはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用する際、このソフトウェアまたはハードウェアを安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

OracleおよびJavaはOracleおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXはThe Open Groupの登録商標です。

このソフトウェアまたはハードウェアおよびドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。

目次

タイトルおよび著作権情報

はじめに

- 対象読者

- ドキュメントのアクセシビリティについて

- 関連ドキュメント

- 表記規則

このリリースの『Oracle Universal Connection Pool for JDBC開発者ガイド』における変更

- Oracle Database 12cリリース1 (12.1)における変更

1 UCPの概要

- 接続プールの概要

- 接続プールの使用のメリット

- Universal Connection Pool for JDBCの概要

- 概念アーキテクチャ

- 接続プールのプロパティ

- 接続プール・マネージャ

- 高可用性およびパフォーマンスのシナリオ

2 スタート・ガイド

- UCPを使用するための要件

- UCPでの基本的な接続の手順

- UCPを使用した基本的な接続の例

- UCP for JDBC APIの概要

3 UCPでのデータベース接続の取得

- UCPからの接続の流用

- プール対応のデータソースの使用方法

- プール対応のXAデータソースの使用方法

- 接続プロパティの設定

- JNDIを使用した接続の流用

- 接続初期化コールバック

- 初期化コールバックの作成

- 初期化コールバックの登録

- 初期化コールバックの削除または登録解除

- UCP接続プールのプロパティの設定

- UCPでの接続の検証

- 流用時の検証

- 接続の有効性のチェック

- UCPへの流用された接続の返却

- UCPからの接続の削除

- サード・パーティの統合

4 ユニバーサル接続プールの動作の最適化

- 接続プールの最適化の概要

- UCPでのプール・サイズの制御

- 初期プール・サイズの設定

- 最小プール・サイズの設定

- 最大プール・サイズの設定

- UCPでの失効した接続の制御

- 接続再利用の設定

- 最大接続再使用時間の設定

- 最大接続再使用数の設定

- 中止接続タイムアウトの設定

- TTL接続タイムアウトの設定

- 接続待機タイムアウトの設定

- 非アクティブ接続タイムアウトの設定

- タイムアウト・チェック間隔の設定

- UCPでの接続の獲得

- 接続が獲得可能かどうかの設定

- 獲得トリガー数の設定

- 獲得最大数の設定

- UCPでのSQL文のキャッシング

- 文キャッシングの有効化

5 UCPでの接続のラベル付け

- UCPでの接続のラベル付けの概要

- UCPでのラベリング・コールバックの実装

- ラベリング・コールバックの作成

- ラベリング・コールバックの例

- ラベリング・コールバックの登録

- ラベリング・コールバックの削除

- DRCPでのUCPの使用

- UCPでの接続ラベルの適用

- UCPからのラベル付けされた接続の流用

- UCPでの不一致ラベルのチェック

- UCPからの接続ラベルの削除

6 再利用可能な接続の動作の制御

- AbandonedConnectionTimeoutCallback

- TimeToLiveConnectionTimeoutCallback

7 接続プール・マネージャの使用方法

- UCPマネージャの使用方法

- 接続プール・マネージャの概要

- 接続プール・マネージャの作成

- 接続のライフ・サイクルの制御

- 接続プールの作成

- 接続プールの起動

- 接続プールの停止

- 接続プールの破棄

- 接続プールに対するメンテナンスの実行

- 接続プールのリフレッシュ

- 接続プールのリサイクル

- 接続プールのパージ

- JMXベース管理へのアクセス

- UniversalConnectionPoolManagerMBean

- UniversalConnectionPoolMBean

8 Oracle RAC機能の使用方法

- Oracle RAC機能の概要

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

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

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

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

- 実行される処理

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

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

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

- ONSの構成

- ONS構成ファイルの概要

- リモート構成

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

- 接続URLの構成

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

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

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

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

- 接続アフィニティの概要

- 接続アフィニティの設定

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

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

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

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

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

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

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

9 アプリケーション・コンティニュイティの保証

- データソースの構成

- 接続ラベリング

- 接続初期化コールバック

10 接続プールの診断

- プールの統計情報

- ダイナミック・モニタリング・サービス・メトリック

- Oracle RACの統計情報の表示

- 高速接続フェイルオーバーの統計情報

- 実行時接続ロード・バランスの統計情報

- 接続アフィニティの統計情報

- UCPでのロギングの設定

- ロギング・プロパティ・ファイルの使用方法

- UCP for JDBC APIおよびJDK APIの使用方法

- サポートされるログ・レベル

- 例外およびエラー・コード

A エラー・コード・リファレンス

- UCPエラー・メッセージの一般構造

- 接続プール・レイヤーのエラー・メッセージ

- JDBCデータソースおよび動的プロキシのエラー・メッセージ

索引

はじめに

Oracle Universal Connection Pool (UCP) for JDBCは、データベース接続を管理するためのフル機能を搭載した接続プールです。データベース集約型のJavaアプリケーションでは、この接続プールを使用することでパフォーマンスが向上し、システム・リソースをより効率的に利用します。

このガイドでは、UCP for JDBC APIの使用方法を詳しく説明し、様々な使用例を示します。ただし、Oracle JDBCドライバ、Oracle DatabaseまたはSQLの使用については、UCP for JDBCを理解する上で必要な場合を除き、詳しく説明しません。

対象読者

このガイドは、UCP for JDBCを使用してJavaアプリケーション用のデータベース接続を作成および管理する方法を習得しようとするアプリケーション開発者およびシステム設計者を主に対象としています。このガイドを使用するにあたって、JavaおよびJDBCに精通している必要があります。UCP for JDBCの一部の機能を使用する際には、Oracle Databaseの概念(Oracle RACやONSなど)についての知識が必要です。

ドキュメントのアクセシビリティについて

オラクル社のアクセシビリティへの取組みの詳細は、Oracle Accessibility ProgramのWebサイトhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=docaccを参照してください。

Oracleサポートへのアクセス

Oracleのお客様は、My Oracle Supportにアクセスして電子サポートを受けることができます。詳細は、http://www.oracle.com/pls/topic/lookup?ctx=acc&id=infoまたはhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=trs (聴覚障害者向け)を参照してください。

関連ドキュメント

Oracle DatabaseでJavaを使用する方法の詳細は、Oracle Databaseドキュメント・セットの次のマニュアルを参照してください。

- 『Oracle Database JDBC開発者ガイド』

- 『Oracle Database 2日でJava開発者ガイド』

- 『Oracle Database Java開発者ガイド』

表記規則

このマニュアルでは次の表記規則を使用します。

規則

意味

太字

太字は、操作に関連するGraphical User Interface要素、または本文中で定義されている用語および用語集に記載されている用語を示します。

イタリック体

イタリックは、ユーザーが特定の値を指定するプレースホルダ変数を示します。

固定幅フォント

固定幅フォントは、段落内のコマンド、URL、サンプル内のコード、画面に表示されるテキスト、または入力するテキストを示します。

このリリースの『Oracle Universal Connection Pool for JDBC開発者ガイド』における変更

内容は次のとおりです。

- Oracle Database 12cリリース1 (12.1)における変更

Oracle Database 12c リリース1(12.1)における変更

Oracle Database 12c リリース1(12.1)の『Oracle Universal Connection Pool for JDBC開発者ガイド』における変更は次のとおりです。

新機能

このリリースの新機能は次のとおりです。

- アプリケーション・コンティニュイティのサポート
第9章「アプリケーション・コンティニュイティの保証」を参照してください。

- グローバル・データ・サービスのサポート
「グローバル・データ・サービスの使用方法」を参照してください。

- データベース常駐接続プールのサポート
データベース常駐接続プール(DRCP)は、多くのクライアントで共有されるサーバーの接続プールです。アクティブ接続数がオープン接続数より大幅に少ない場合、接続プールのDRCPを使用する必要があります。Universal Connection Pool for JDBCは、DRCP機能を完全にサポートします。

「DRCPでのUCPの使用」を参照してください。

関連項目:
データベース常駐接続プールの詳細は『Oracle Database JDBC開発者ガイド』を参照してください。

- 計画停止の場合の適切な排出のサポート
「計画停止のシナリオ」を参照してください。

Javaのマルチテナント・データ・ソース

複数のPDB(プラガブル・データベース)またはテナント間の接続の共通プールの共有を有効にするために、Oracle JDBCおよびUCPではJavaのマルチテナント・データ・ソースを提供します。Oracle Database 12cリリース1 (12.1)では、これは、次を組み合せたものに基づきます。

- 任意のPDBに対するアクセス権を保持するグローバル・データベース・ユーザー

- UCP接続ラベリング

- コールバック機能の新しいSET CONTAINER文
SET CONTAINER文の利点は、別のPDBへの既存の接続がある場合に、プールでPDBへの新しい接続を作成する必要がないことです。プールでは、既存の接続を使用でき、SET CONTAINER文で、目的のPDBに接続できます。このためには、次のコマンドを使用します。

ALTER SESSION SET CONTAINER=<PDB Name>

これによって、新しい接続を最初から作成する必要がなくなります。

- UCP接続ラベリング・コールバック・インタフェース

次の図でJavaのマルチテナント・データ・ソースの動作方法を示します。

1. Tenant1は、データベースIDにマップされた対応するラベルを使用してgetConnection()メソッドをコールすることで、PDB1への接続を要求します。

2. UCPは、使用されていない接続がプールにあるかを特定のラベルを仮に使用して検索します。

3. Conn1ラベルがPDB1を読み取る場合、接続はJDBCに渡されてから、使用のためにTenant1に渡されます。
または、Conn1ラベルがPDB1を読み取らない場合、次のことが発生します。

1. UCPはALTER SESSION SET CONTAINER文を使用し、ユーザー実装コールバックconfigureメソッドを起動して、Conn1をPDB1に設定します。

2. SET CONTAINER文がサーバーに渡されて解析されます。

3. サーバーは、その文を実行し、PDB固有のロールをTenant1脚注 1 に割り当てます。

4. その後、サーバーはConn1をPDB1に接続してから、対応するデータベースID (dbid)およびその他のプロパティをJDBCに戻します。

5. JDBCはUCPに通知して、Conn1をTenant1に使用のために渡します。

関連項目:
Oracle Technology Networkに投稿されたJavaのマルチテナント・データ・ソースのホワイト・ペーパー:
http://www.oracle.com/technetwork/database/application-development/index-099369.html

脚注

脚注 1: PDBのグローバル・ユーザーの場合、パスワードで保護されているロールなしでは多くのタスクを実行できません。

1 UCPの概要

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

- 接続プールの概要

- Universal Connection Pool for JDBCの概要

接続プールの概要

接続プールは、データベース接続オブジェクトのキャッシュです。オブジェクトは、アプリケーションでデータベースへの接続に使用できる物理的なデータベース接続を表します。実行時に、アプリケーションはプールに接続をリクエストします。リクエストを満たすことができる接続がプールにある場合、その接続がアプリケーションに戻されます。接続が見つからない場合は、新しい接続が作成されてアプリケーションに戻されます。アプリケーションは、その接続を使用してデータベースで処理を実行した後、オブジェクトをプールに返します。その接続は次の接続リクエストに使用できます。

接続プールは、接続オブジェクトが再利用されるようにして、接続オブジェクトが作成される回数を減らします。接続プールにより、データベース集約型のアプリケーションのパフォーマンスは大幅に向上します。これは、接続オブジェクトの作成には時間とリソースの両面でコストがかかるためです。ネットワーク通信、接続文字列の読取り、認証、トランザクション参加、メモリー割当てなどのタスクはすべて、接続オブジェクトの作成に必要な時間およびリソースの一因となります。また、接続がすでに作成されているので、アプリケーションが接続を取得するための待機時間が短くなります。

多くの場合、接続プールには、プールのパフォーマンスを最適化するために使用されるプロパティが用意されています。これらのプロパティにより、プールで許容される最小および最大接続数や、接続がプールに返されるまでアイドル状態でいられる時間などの動作が制御されます。最適に構成された接続プールでは、短いレスポンス時間とプール内の接続を維持するために消費されるメモリーとのバランスがとられます。多くの場合、特定のアプリケーションに対して最適なバランスを実現するまでに、様々な設定を試す必要があります。

接続プールの使用のメリット

一般に、データベース集約型のアプリケーションに最も効果があるのは、接続プールです。データベース使用率がアプリケーションのパフォーマンスに影響を及ぼすことがわかっている場合は常に、方針としてアプリケーションで接続プールを使用する必要があります。

接続プールには、次のメリットがあります。

- 新しい接続オブジェクトが作成される回数を減らします。

- 接続オブジェクトの再利用を促します。

- 接続の取得プロセスを短縮します。

- 接続オブジェクトを手動で管理するために必要な労力を削減します。

- 失効した接続数を最小限にします。

- 接続の維持に消費されるリソース量を制御します。

Universal Connection Pool for JDBCの概要

UCP for JDBCは、JDBC接続をキャッシュするための接続プールを実装します。データベース集約型のJavaアプリケーションでは、この接続プールを使用することでパフォーマンスが向上し、システム・リソースをより効率的に利用します。

UCP JDBC接続プールでは任意のJDBCドライバを使用して物理接続を作成することができ、作成した接続はプールで管理されます。このプールは構成可能で、アプリケーションのパフォーマンス要件や可用性要件に基づいてプールの動作を最適化するために使用するプロパティが一式用意されています。さらに高度なアプリケーションでは、UCP for JDBCのプール・マネージャを使用して、プール・インスタンスを管理できます。

また、プールは、Oracle Real Application Clusters (Oracle RAC)データベースを通して使用できる多くの高可用性およびパフォーマンス機能を利用します。これらの機能には、高速接続フェイルオーバー(FCF)、実行時接続ロード・バランシング(RLB)および接続アフィニティがあります。

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

概念アーキテクチャ

アプリケーションは、UCP for JDBCプール対応のデータソースを使用して、UCP JDBC接続プール・インスタンスから接続を取得します。PoolDataSourceデータソースは標準接続(java.sql.Connection)の取得に、PoolXADataSourceデータソースはXA (eXtended API)接続(javax.sql.XAConnection)の取得に使用されます。XAと非XAのどちらのUCP JDBC接続プールにも同じプール機能があります。

プール対応のデータソースは、コネクション・ファクトリ・クラスを利用して、プールで保持される物理的な接続を作成します。アプリケーションは、ConnectionオブジェクトまたはXAConnectionオブジェクトを作成できるファクトリ・クラスの使用を選択できます。プール対応のデータソースには、コネクション・ファクトリ・クラスを設定するためのメソッドの他、ファクトリ・クラスでデータベースへの接続に使用されるデータベースURLおよびデータベース資格証明書を設定するためのメソッドがあります。

アプリケーションは、接続ハンドルをプールから流用してデータベースで処理を実行します。処理が完了すると、接続はクローズされ、接続ハンドルはプールに返されて再利用できるようになります。下の図1-1に、アプリケーションとUCP JDBC接続プール間のやりとりの概念図を示します。

プール対応のデータソースの使用およびデータベース接続の流用の詳細は、第3章「UCPでのデータベース接続の取得」を参照してください。

図1-1 UCP JDBC接続プールの概念図

接続プールのプロパティ

UCP JDBC接続プールのプロパティは、プール対応のデータソースで使用可能なメソッドを使用して構成されます。プールのプロパティは、プール・サイズの制御や失効した接続の処理、接続がプールに返されるまで流用された状態でいられる時間に関する自律的な決定に使用されます。プール・プロパティの最適な設定は、アプリケーションおよびハードウェアのリソースによって決まります。通常、アプリケーションが接続を取得するために必要な時間と、一定のプール・サイズの維持に必要なメモリー量との間にはトレードオフが存在します。多くの場合、特定のアプリケーションについて目標のパフォーマンスを実現する最適なバランスを見つけるには、実験が必要です。

接続プールのプロパティの設定の詳細は、第4章「Universal Connection Poolの動作の最適化」を参照してください。

接続プール・マネージャ

UCP for JDBCには、接続プールの管理統制を必要とするアプリケーションで使用される接続プール・マネージャがあります。このマネージャは、プールのライフ・サイクルの明示的な制御およびプールのメンテナンスに使用されます。また、マネージャを使用すると、管理コンソールを介してアプリケーションのプールとその管理の容易さを公開できます。

接続プールの明示的な制御の詳細は、第7章「接続プール・マネージャの使用方法」を参照してください。

高可用性およびパフォーマンスのシナリオ

UCP JDBC接続プールには、接続の高可用性およびパフォーマンスを確保するために使用される多くの機能があります。プールのリフレッシュや接続の検証など、これらの機能の多くは一般的なものであり、あらゆるドライバおよびデータベースの実装で機能します。実行時接続ロード・バランシング、接続アフィニティなど、これらの機能の一部は、Oracle JDBCドライバおよびOracle RACデータベースを使用する必要があります。

Oracle RAC機能の使用の詳細は、第8章「Oracle RAC機能の使用方法」を参照してください。

2 スタート・ガイド

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

- UCPを使用するための要件

- UCPでの基本的な接続の手順

- UCPを使用した基本的な接続の例

- UCP for JDBC APIの概要

UCPを使用するための要件

UCP for JDBCには、次の設計時および実行時の要件があります。

- JRE 1.5以上

- JDBCドライバまたはjava.sql.Connectionオブジェクトおよびjavax.sql.XAConnectionオブジェクトを戻すことができるコネクション・ファクトリ・クラス
リリース10.1以上のOracleドライバがサポートされます。Oracle RACや高速接続フェイルオーバーなどのOracle Databaseの拡張機能には、Oracle Clientソフトウェアに同梱されているOracle Notification Serviceライブラリ(ons.jar)が必要です。

- ucp.jarライブラリ(アプリケーションのクラスパスに指定)。

- SQL対応のデータベース。Oracle RACや高速接続フェイルオーバーなどの拡張機能には、Oracle Databaseが必要です。

UCPでの基本的な接続の手順

UCP for JDBCには、UCP JDBC接続プールから接続を流用するためにアプリケーションで使用されるプール対応のデータソースが用意されています。最も基本的な使用例では、接続プールは明示的に定義されません。かわりに、接続が流用される際に、デフォルトの接続プールが暗黙的に作成されます。

次の手順では、データベースにアクセスするために、UCP for JDBCプール対応のデータソースから接続を取得する方法について説明します。例の詳細は、例2-1「基本的な接続の例」を参照してください。

1. UCP for JDBCのデータソース・ファクトリ(oracle.ucp.jdbc.PoolDataSourceFactory)を使用し、getPoolDataSourceメソッドを使用してプール対応のデータソースのインスタンスを取得します。データソース・インスタンスの型はPoolDataSourceである必要があります。次に例を示します。

PoolDataSource  pds = PoolDataSourceFactory.getPoolDataSource();

2. データベースへの物理的な接続の取得に必要な接続プロパティを設定します。これらのプロパティはデータソース・インスタンスに設定され、データベースに接続するためのURL、ユーザー名およびパスワード、物理的な接続の取得に使用されるコネクション・ファクトリなどがあります。これらは、JDBCドライバおよびデータベースに固有のプロパティです。次に例を示します。

pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");
pds.setURL("jdbc:oracle:thin:@//localhost:1521/XE");
pds.setUser("<user>");
pds.setPassword("<password>");

3. 接続プールのデフォルトの動作を上書きするために、プール・プロパティを設定します。プール・プロパティはデータソース・インスタンスに設定されます。次に例を示します。

pds.setInitialPoolSize(5);

4. データソース・インスタンスを使用して接続を取得します。戻される接続は、データソースの接続プール内にある物理的な接続への論理的なハンドルです。次に例を示します。

Connection conn = pds.getConnection();

5. 接続を使用して、データベースで処理を実行します。

Statement stmt = conn.createStatement ();
stmt.execute("SELECT * FROM foo");

6. 接続をクローズし、プールに返します。

conn.close();

UCPを使用した基本的な接続の例

次の例では、データベースに接続して処理を実行し、終了するプログラムを示します。この例は単純で、場合によってはあまり実用的ではありません。しかし、データベースにアクセスするために、UCP for JDBCプール対応のデータソースから接続を取得するのに必要な基本的な手順を示しています。

例2-1 基本的な接続の例

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import oracle.ucp.jdbc.PoolDataSourceFactory;
import oracle.ucp.jdbc.PoolDataSource;

public class BasicConnectionExample {
public static void main(String args[]) throws SQLException {
try
{
//Create pool-enabled data source instance.

PoolDataSource  pds = PoolDataSourceFactory.getPoolDataSource();

//set the connection properties on the data source.

pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");
pds.setURL("jdbc:oracle:thin:@//localhost:1521/XE");
pds.setUser("<user>");
pds.setPassword("<password>");

//Override any pool properties.

pds.setInitialPoolSize(5);

//Get a database connection from the datasource.

Connection conn = pds.getConnection();

System.out.println("\nConnection obtained from " +
"UniversalConnectionPool\n");

//do some work with the connection.
Statement stmt = conn.createStatement();
stmt.execute("select * from foo");

//Close the Connection.

conn.close();
conn=null;

System.out.println("Connection returned to the " +
"UniversalConnectionPool\n");

}
catch(SQLException e)
{
System.out.println("BasicConnectionExample - " +
"main()-SQLException occurred : "
+ e.getMessage());
}
}
}

UCP for JDBC APIの概要

次の各項では、最も一般的に使用されるUCP for JDBC APIのパッケージの概略を示します。APIの詳細は、『Oracle Universal Connection Pool Java API Reference』を参照してください。

oracle.ucp.jdbc

このパッケージには、JDBC接続および接続プールを使用して処理を実行するためにアプリケーションで使用される様々なインタフェースおよびクラスが含まれます。このパッケージに含まれるインタフェースの中でPoolDataSourceおよびPoolXADataSourceデータソース・インタフェースが、接続の取得と接続プールのプロパティの取得および設定のために使用されます。これら2つのインタフェースを実装するデータソース・インスタンスは、接続プールを自動的に作成します。

oracle.ucp.admin

このパッケージには、接続プール・マネージャを使用するためのインタフェースが含まれます。また、ユーザーがJMX操作を使用し、接続プールと接続プール・マネージャの操作および属性にアクセスできるようにするMBeanを使用するためのインタフェースも含まれます。インタフェースの中でも、UniversalConnectionPoolManagerインタフェースが、接続プール・インスタンスを作成およびメンテナンスするためのメソッドを提供します。

oracle.ucp

このパッケージには、接続プール機能の実装に使用される必須および任意のコールバック・インタフェースが含まれます。たとえば、ConnectionAffinityCallbackインタフェースは、接続アフィニティを有効または無効にするコールバックの作成に使用されますが、接続アフィニティの動作のカスタマイズにも使用できます。また、このパッケージには、統計クラス、UCP固有の例外クラス、およびデータソースを使用しないでUCPを直接使用するためのロジックも含まれます。

3 UCPでのデータベース接続の取得

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

- UCPからの接続の流用

- UCP接続プールのプロパティの設定

- UCPでの接続の検証

- UCPへの流用された接続の返却

- UCPからの接続の削除

- サード・パーティの統合

UCPからの接続の流用

アプリケーションは、プール対応のデータソースを使用して接続を流用します。UCP for JDBC APIは、2つのプール対応のデータソースを備えています。1つは標準接続を流用するためのものであり、もう1つはXA接続を流用するためのものです。これらのデータソースは、UCP JDBC接続プール機能にアクセスでき、接続の流用に使用される一連のgetConnectionメソッドを備えています。XAと非XAのどちらのUCP JDBC接続プールにも同じプール機能があります。

UCP JDBC接続プールは、使用可能な接続と流用された接続の両方を保持します。アプリケーションが使用可能な接続と一致する接続の流用をリクエストすると、プールの接続が再利用されます。プール内の使用可能な接続がリクエストされた接続と一致しない場合は、新しい接続が作成されます。使用可能な接続と流用された接続の数は、プール・サイズ、タイムアウト間隔および検証ルールなどのプールのプロパティによって異なります。

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

- プール対応のデータソースの使用方法

- プール対応のXAデータソースの使用方法

- 接続プロパティの設定

- JNDIを使用した接続の流用

- 接続初期化コールバック

注意:
この項の説明では、プール対応のデータソースを使用して接続プールを暗黙的に作成および起動します。接続プール・マネージャを使用した接続プールの明示的な作成方法は、第7章「接続プール・マネージャの使用方法」を参照してください。

プール対応のデータソースの使用方法

UCP for JDBCには、データベースへの接続の取得に使用されるプール対応のデータソース(oracle.ucp.jdbc.PoolDataSource)があります。oracle.ucp.jdbc.PoolDataSourceFactoryファクトリ・クラスは、プール対応のデータソース・インスタンスを作成するgetPoolDataSource()メソッドを備えています。次に例を示します。

PoolDataSource  pds = PoolDataSourceFactory.getPoolDataSource();

プール対応のデータソースには、実際の物理的な接続を取得するためにコネクション・ファクトリ・クラスが必要です。通常、コネクション・ファクトリはJDBCドライバの一部として提供され、データソースそのものにすることができます。UCP JDBC接続プールでは任意のJDBCドライバを使用して物理接続を作成することができ、作成した接続はプールで管理されます。setConnectionFactoryClassName(String)メソッドは、プール対応のデータソース・インスタンスにコネクション・ファクトリを定義するために使用されます。次の例では、JDBCドライバに付属するOracleのoracle.jdbc.pool.OracleDataSourceコネクション・ファクトリ・クラスを使用しています。他のベンダーのJDBCドライバを使用している場合は、該当するコネクション・ファクトリ・クラスについてベンダーのドキュメントを参照してください。

pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");

コネクション・ファクトリ・クラスに加えて、プール対応のデータソースには、データベースへの接続に使用されるURL、ユーザー名およびパスワードが必要です。プール対応のデータソース・インスタンスは、これらの各プロパティを設定するメソッドを備えています。次の例では、Oracle JDBC Thinドライバの構文を使用しています。他のベンダーのJDBCドライバを使用している場合は、使用する適切なURL構文についてベンダーのドキュメントを参照してください。

pds.setURL("jdbc:oracle:thin:@//localhost:1521/XE");
pds.setUser("user");
pds.setPassword("password");

注意:
Oracle URL構文の使用方法は、『Oracle Database JDBC開発者ガイド』を参照してください。

最後に、プール対応のデータソースは、一連のgetConnectionメソッドを備えています。メソッドには次のものがあります。

- getConnection(): データベースへの接続に使用されたユーザー名およびパスワードと関連付けられている接続を戻します。

- getConnection(String username, String password): 指定されたユーザー名およびパスワードと関連付けられている接続を戻します。

- getConnection(java.util.Properties labels): 指定されたラベルと一致する接続を戻します。接続ラベルの使用方法は、第5章「UCPでの接続のラベル付け」を参照してください。

- getConnection(String username, String password, java.util.Properties labels): 指定されたユーザー名およびパスワードと関連付けられ、指定されたラベルと一致する接続を戻します。接続ラベルの使用方法は、第5章「UCPでの接続のラベル付け」を参照してください。

アプリケーションは、getConnectionメソッドを使用して、java.sql.Connectionタイプの接続ハンドルをプールから流用します。リクエストされた接続と一致する(同じURL、ユーザー名およびパスワード)接続ハンドルがすでにプール内に存在する場合は、その接続ハンドルがアプリケーションに戻されます。存在しない場合は、新しい接続が作成され、新しい接続ハンドルがアプリケーションに戻されます。OracleとMySQLの両方の例を示します。

Oracleの例

次の例では、JDBC Thinドライバを使用する場合の接続の流用を示します。

PoolDataSource  pds = PoolDataSourceFactory.getPoolDataSource();

pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");
pds.setURL("jdbc:oracle:thin:@//localhost:1521/XE");
pds.setUser("<user>");
pds.setPassword("<password>");

Connection conn = pds.getConnection();

MySQLの例

次の例では、MySQLのConnector/J JDBCドライバを使用する場合の接続の流用を示します。

PoolDataSource  pds = PoolDataSourceFactory.getPoolDataSource();

pds.setConnectionFactoryClassName("com.mysql.jdbc.jdbc2.optional.
MysqlDataSource");
pds.setURL("jdbc:mysql://host:3306/dbname");
pds.setUser("<user>");
pds.setPassword("<password>");

Connection conn = pds.getConnection();

プール対応のXAデータソースの使用方法

UCP for JDBCには、プール対応のXAデータソース(oracle.ucp.jdbc.PoolXADataSource)があります。これは、分散トランザクションに参加できるXA接続の取得に使用されます。UCP JDBC XAプールには、非XAのUCP JDBCプールと同じ機能があります。oracle.ucp.jdbc.PoolDataSourceFactoryファクトリ・クラスは、プール対応のXAデータソース・インスタンスを作成するgetPoolXADataSource()メソッドを備えています。次に例を示します。

PoolXADataSource  pds = PoolDataSourceFactory.getPoolXADataSource();

プール対応のXAデータソース・インスタンスには、非XAデータソース・インスタンスと同様、実際の物理的な接続を取得するためにコネクション・ファクトリ、URL、ユーザー名およびパスワードが必要です。これらのプロパティは、非XAデータソース・インスタンスと同様の方法(前述参照)で設定されます。しかし、XA接続を取得するには、XA固有のコネクション・ファクトリ・クラスが必要です。通常、XAコネクション・ファクトリはJDBCドライバの一部として提供され、データソースそのものにすることができます。次の例では、JDBCドライバに付属するOracleのoracle.jdbc.xa.client.OracleXADataSource XAコネクション・ファクトリ・クラスを使用しています。他のベンダーのJDBCドライバを使用している場合は、該当するXAコネクション・ファクトリ・クラスについてベンダーのドキュメントを参照してください。

pds.setConnectionFactoryClassName("oracle.jdbc.xa.client.OracleXADataSource");
pds.setURL("jdbc:oracle:thin:@//localhost:1521/XE");
pds.setUser("user");
pds.setPassword("password");

最後に、プール対応のXAデータソースは、一連のgetXAConnectionメソッドを備えています。これらのメソッドは、javax.sql.XAConnectionタイプの接続ハンドルをプールから流用するために使用されます。getXAConnectionメソッドは、前述のgetConnectionメソッドと同じです。次の例では、XA接続の流用を示します。

PoolXADataSource  pds = PoolDataSourceFactory.getPoolXADataSource();

pds.setConnectionFactoryClassName("oracle.jdbc.xa.client.OracleXADataSource");
pds.setURL("jdbc:oracle:thin:@//localhost:1521/XE");
pds.setUser("<user>");
pds.setPassword("<password>");

XAConnection conn = pds.getXAConnection();

接続プロパティの設定

Oracleのコネクション・ファクトリでは、特定の機能を使用して接続を構成するプロパティがサポートされます。UCP for JDBCプール対応のデータソースは、setConnectionProperties(Properties)メソッドを備えています。このメソッドは、指定されたコネクション・ファクトリにプロパティを設定するために使用されます。次の例では、OracleのJDBCドライバの接続プロパティの設定を示します。他のベンダーのJDBCドライバを使用している場合は、そのドキュメントを参照して、この方法でのプロパティの設定がサポートされているかどうか、またどのプロパティが使用できるかを確認してください。

Properties connProps = new Properties();
connProps.put("fixedString", false);
connProps.put("remarksReporting", false);
connProps.put("restrictGetTables", false);
connProps.put("includeSynonyms", false);
connProps.put("defaultNChar", false);
connProps.put("AccumulateBatchResult", false);

pds.setConnectionProperties(connProps);

UCP JDBC接続プールは、プールの作成後および使用中にsetConnectionPropertiesがコールされた場合、作成済の接続を削除しません。

関連項目:
接続を構成するためのサポートされているプロパティの詳細なリストは、Oracle Database JDBC Java APIリファレンスを参照してください。たとえば、自動コミット・モードを設定するには、OracleConnection.CONNECTION_PROPERTY_AUTOCOMMITプロパティを使用できます。

JNDIを使用した接続の流用

接続は、プール対応のデータソースのJNDIルックアップを実行し、戻されたオブジェクトでgetConnection()をコールすることで、接続プールから流用できます。まず、プール対応のデータソースをJNDIコンテキストおよび論理名にバインドする必要があります。これは、オブジェクト参照の登録および検索が可能な、ネーミングおよびディレクトリ・サービス用のサービス・プロバイダ・インタフェース(SPI)をアプリケーションが実装していることを前提とします。

次の例では、Sun社のファイル・システムJNDIサービス・プロバイダを使用しています。このサービス・プロバイダは、次のJNDIソフトウェア・ダウンロード・ページからダウンロードできます。

http://www.oracle.com/technetwork/java/index.html

この例では、初期コンテキストを作成した後、MyPooledDataSourceという名前にバインドされているプール対応のデータソースのルックアップを実行しています。その後、戻されたオブジェクトを使用して接続プールから接続を流用しています。

Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.fscontext.RefFSContextFactory");
env.put(Context.PROVIDER_URL, "file:/tmp");

ctx = new InitialContext(env);

PoolDataSource jpds = (PoolDataSource)ctx.lookup(MyPooledDataSource);
Connection conn = jpds.getConnection();

この例では、MyPoolDataSourceをコンテキストにバインドする必要があります。次に例を示します。

PoolDataSource  pds = PoolDataSourceFactory.getPoolDataSource();

pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");
pds.setURL("jdbc:oracle:thin:@//localhost:1521/XE");
pds.setUser("<user>");
pds.setPassword("<password>");

ctx.bind(MyPooledDataSource, pds);

接続初期化コールバック

このコールバックにより、アプリケーションおよびフレームワークはユニバーサル接続プールから取得される接続を初期化できます。プールからの接続のチェックアウトのたびに、またファイルオーバー中に再接続が成功するたびに、初期化コールバックが実行されます。

変更できないため、アプリケーションで接続ラベリングを使用しない場合、このようなアプリケーションには接続初期化コールバックが提供されます。

登録されると、接続がプールから流用されるたびに、またリカバリ可能なエラー後に再接続が成功するたびに、初期化コールバックは実行されます。実行時とリプレイ時の両方に同じコールバックを使用すると、元のセッションの確立時に使用されたのとまったく同じ初期化が実行時に確実に再設定されます。コールバックの起動が失敗した場合、リプレイはその接続で無効になります。

次の項で、初期化コールバックについて説明します。

- 初期化コールバックの作成

- 初期化コールバックの登録

- 初期化コールバックの削除または登録解除

初期化コールバックの作成

UCP接続初期化コールバックを作成するために、アプリケーションはoracle.ucp.jdbc.ConnectionInitializationCallbackインタフェースを実装しています。このインタフェースには、次のメソッドがあります。

void initialize(java.sql.Connection connection) throws SQLException;

注意:

- コールバックは、接続プールごとに1つ作成されます。

- このコールバックは、ラベリング・コールバックが接続プール用に登録されている場合、使用されません。

例

次の例では、単純な初期化コールバックの作成方法を示します。

import oracle.ucp.jdbc.ConnectionInitializationCallback;
class MyConnectionInitializationCallback implements ConnectionInitializationCallback
{
public MyConnectionInitializationCallback()
{
...
}
public void initialize(java.sql.Connection connection) throws SQLException
{
// Reset the state for the connection, if necessary (like ALTER SESSION)
}
}

初期化コールバックの登録

UCPには、接続初期化コールバックを登録するために、oracle.ucp.jdbc.PoolDataSourceインタフェースにregisterConnectionInitializationCallbackメソッドが用意されています。

public void registerConnectionInitializationCallback (ConnectionInitializationCallback cbk) throws SQLException;

コールバックは、各接続プール・インスタンスに1つ登録できます。

初期化コールバックの削除または登録解除

UCPには、接続初期化コールバックを登録解除するために、oracle.ucp.jdbc.PoolDataSourceインタフェースにunregisterConnectionInitializationCallbackメソッドが用意されています。

public void unregisterConnectionInitializationCallback (ConnectionInitializationCallback cbk) throws SQLException;

関連項目:
詳細は、Oracle Universal Connection Pool for JDBC Java APIリファレンスを参照してください

UCP接続プールのプロパティの設定

UCP JDBC接続プールは、接続プールのプロパティを使用して構成します。プロパティには、プール対応のデータソース・インスタンスで使用可能なgetメソッドとsetメソッドがあります。これらのメソッドは、プールをプログラムで構成するための便利な手段です。プールのプロパティが設定されていない場合、接続プールはデフォルトのプロパティ値を使用します。

次の例では、接続プールのプロパティの構成を示します。この例では、接続プール名およびプールで許容される最大/最小接続数を設定しています。サポートされる全プロパティとそのデフォルト値の詳細は、第4章「ユニバーサル接続プールの動作の最適化」を参照してください。

PoolDataSource  pds = PoolDataSourceFactory.getPoolDataSource();

pds.setConnectionPoolName("JDBC_UCP");
pds.setMinPoolSize(4);pds.setMaxPoolSize(20);

UCP JDBC接続プールのプロパティは任意の順序で設定できます。また、実行時に動的に変更できます。たとえば、setMaxPoolSizeはいつでも変更できます。プールはその新しい値を認識し、その値に適応します。

UCPでの接続の検証

接続は、接続の流用時にプールのプロパティを使用して検証できます。また、ValidConnectionインタフェースを使用してプログラムで検証することもできます。この項では、これら2つの方法について詳しく説明します。無効な接続は、アプリケーションのパフォーマンスおよび可用性に影響を及ぼす可能性があります。

流用時の検証

接続プールから接続を流用する際に、接続に対してSQL文を実行することで、接続を検証できます。接続の検証を有効にするには、次の2つの接続プールのプロパティを組み合せて使用します。

- setValidateConnectionOnBorrow(boolean): 接続プールから接続を流用する際に、接続を検証するかどうかを指定します。このメソッドにより、プールから流用されるすべての接続に対して検証が有効になります。false値は、検証を実行しないことを意味します。デフォルト値はfalseです。

- setSQLForValidateConnection(String): プールから接続を流用する際に、接続に対して実行されるSQL文を指定します。

注意:
setSQLForValidateConnectionプロパティは、Oracle JDBCドライバを使用している場合には使用しないでください。Oracle JDBCドライバを使用している場合、UCP for JDBCは内部pingを実行します。このメカニズムはSQL文の実行よりも高速ですが、このプロパティを設定すると上書きされます。かわりに、setSQLForValidateConnectionプロパティを使用せずに、setValidateConnectionOnBorrowプロパティをtrueに設定してください。

次の例では、プールから接続を流用する際の接続の検証を示します。この例では、MySQLのConnector/J JDBCドライバを使用しています。

PoolDataSource  pds = PoolDataSourceFactory.getPoolDataSource();

pds.setConnectionFactoryClassName("com.mysql.jdbc.jdbc2.optional.
MysqlDataSource");
pds.setURL("jdbc:mysql://host:3306/mysql");
pds.setUser("<user>");
pds.setPassword("<password>");

pds.setValidateConnectionOnBorrow(true);
pds.setSQLForValidateConnection("select * from mysql.user");

Connection conn = pds.getConnection();

接続の有効性のチェック

oracle.ucp.jdbc.ValidConnectionインタフェースは、2つのメソッドisValidおよびsetInvalidを備えています。isValidメソッドは接続が使用可能かどうかを戻し、setInvalidメソッドはプール・インスタンスから接続を削除する必要があることを示すために使用されます。setInvalidメソッドの使用方法は、「UCPからの接続の削除」を参照してください。

isValidメソッドは、SQL例外がスローされた後でも接続が使用可能かどうかをチェックするために使用されます。また、いつでも流用された接続が有効であるかどうかをチェックするために使用できます。このメソッドは、Oracle RAC停止イベント後にトリガーされる高速接続フェイルオーバー・アクションなどの再試行メカニズムと組み合せると、特に便利です。高速接続フェイルオーバーの詳細は、第8章「Oracle RAC機能の使用方法」を参照してください。

注意:
isValidメソッドは、プール・インスタンスおよびOracle JDBCドライバを調べて、接続がまだ有効かどうかを判断します。プールとドライバの両方で接続がまだ有効であることがレポートされた場合にかぎり、isValidメソッドによってデータベースへのラウンドトリップが発生します。このラウンドトリップを使用して、プールまたはドライバですぐには検出されないデータベース障害がないかをチェックします。

また、isValidメソッドは、接続タイムアウト機能および接続獲得機能と組み合せて使用しても便利です。これらの機能は、アプリケーションで接続がまだ保持されているときに、接続をプールに返すことができます。このような場合、isValidメソッドはfalseを戻し、アプリケーションが新しい接続を取得できるようにします。

次の例では、isValidメソッドの使用方法を示します。

try {  conn = poolDataSouorce.getConnection  ...}catch (SQLException sqlexc)
{
if (conn == null || !((ValidConnection) conn).isValid())

// take the appropriate action

...
conn.close();
}

XAアプリケーションでは、isValid()メソッドをコールする前に、PoolXADataSourceから取得されるXAConnectionをValidConnectionにキャストする必要があります。XAConnection.getConnection()メソッドをコールして取得されるConnectionをValidConnecionにキャストすると、例外がスローされることがあります。

UCPへの流用された接続の返却

流用された接続のうち、もう使用しないものはプールに返して、次の接続リクエストで使用できるようにする必要があります。closeメソッドにより、接続をクローズしてプールに自動的に返します。closeメソッドは、プールから接続を物理的に削除しません。

クローズしない場合、流用された接続は流用されたままになります。つまり、使用可能な接続がない場合に、後続の接続リクエストによって新しい接続が作成されます。この動作は、多くの接続が作成される原因となり、システム・パフォーマンスに影響を及ぼす可能性があります。

次の例では、接続のクローズおよびプールへの返却を示します。

Connection conn = pds.getConnection();

//do some work with the connection.

conn.close();
conn=null;

UCPからの接続の削除

ValidConnectionインタフェースのsetInvalidメソッドは、接続のクローズ時に、接続プールから接続を削除する必要があることを示します。通常、このメソッドは、例外の後やValidConnectionインタフェースのisValidメソッドがfalseを戻した場合など、接続が使用できなくなったときに使用されます。また、接続の状態が悪いとアプリケーションが判断した場合にも使用できます。次の例では、setInvalidメソッドを使用した接続のクローズおよびプールからの削除を示します。

Connection conn = pds.getConnection();
...

((ValidConnection) conn).setInvalid();
...

conn.close();
conn=null;

サード・パーティの統合

ミドルウェア・プラットフォームやフレームワークなどのサード・パーティ製品では、UCPを使用してアプリケーションおよびサービスに接続プーリング機能を提供できます。UCP統合には、スタンドアロン・アプリケーションで使用できるものと同じ接続プール機能があり、Oracle Databaseとの緊密な統合を提供します。

2つのデータソース・クラスPoolDataSourceImpl(非XA接続プール用)とPoolXADataSourceImpl(XA接続プール用)が、UCPとの統合点として使用できます。どちらのクラスもoracle.ucp.jdbcパッケージにあります。これらのクラスは、それぞれPoolDataSourceインタフェースおよびPoolXADataSourceインタフェースの実装で、デフォルトのコンストラクタがあります。実装クラスの詳細は、『Oracle Universal Connection Pool Java API Reference』を参照してください。

これらの実装では、接続プール・インスタンスを明示的に作成し、接続を返すことができます。次に例を示します。

PoolXADataSource pds = new PoolXADataSourceImpl();

pds.setConnectionFactoryClassName("oracle.jdbc.xa.client.OracleXADataSource");
pds.setURL("jdbc:oracle:thin:@//localhost:1521/XE");
pds.setUser("user");
pds.setPassword("password");

XAConnection conn = pds.getXAConnection();

サード・パーティ製品では、これらのデータソース実装クラスをインスタンス化できます。また、これらのインタフェースのメソッドは、JavaBean設計パターンに準拠しているため、リフレクションを使用して接続プールのプロパティをクラスに設定するために使用できます。たとえば、Oracle JDBCコネクション・ファクトリおよびデータベースを使用するUCPデータソースは、次のように定義して、JNDIレジストリにロードできます。

<data-sources>
<data-source
name="UCPDataSource"
jndi-name="jdbc/UCP_DS"
data-source-class="oracle.ucp.jdbc.PoolDataSourceImpl">
<property name="ConnectionFactoryClassName"
value="oracle.jdbc.pool.OracleDataSource"/>
<property name="URL" value="jdbc:oracle:thin:@//localhost:1521:oracle"/>
<property name="User" value"user"/>
<property name="Password" value="password"/>
<property name="ConnectionPoolName" value="MyPool"/>
<property name="MinPoolSize" value="5"/>
<property name="MaxPoolSize" value="50"/>
</data-source>
</data-sources>

リフレクションを使用する場合、name属性はプロパティの設定に使用されるsetterメソッドの名前(大/小文字を区別)と一致します。つまり、次のようにして、アプリケーションでデータソースを使用できます。

Connection connection = null;
try {
InitialContext context = new InitialContext();
DataSource ds = (DataSource) context.lookup( "jdbc/UCP_DS" );
connection = ds.getConnection();
...

4 ユニバーサル接続プールの動作の最適化

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

- 接続プールの最適化の概要

- UCPでのプール・サイズの制御

- UCPでの失効した接続の制御

- UCPでの接続の獲得

- UCPでのSQL文のキャッシング

接続プールの最適化の概要

この章では、プーリング動作を最適化するための接続プールのプロパティの設定方法について説明します。作成時に、UCP JDBC接続プールはデフォルト設定で事前構成されます。デフォルト設定により、一般的な汎用の接続プールとなります。しかし、アプリケーションにはそれぞれ異なるデータベース接続要件があり、接続プールのデフォルト動作の変更が必要な場合があります。プール・サイズや接続タイムアウトなどの動作を構成して、接続プール全体のパフォーマンスだけでなく接続の可用性も向上させることができます。多くの場合、特定のアプリケーションに合せて接続プールをチューニングする最善の方法は、最適なパフォーマンスおよびスループットを達成するまで、様々な値を使用して様々なプロパティの組合せを試すことです。

接続プールのプロパティの設定

接続プールのプロパティが設定されるのは、プール対応のデータソースを介して接続を取得するときか、接続プール・マネージャを使用して接続プールを作成するときです。

次の例では、プール対応のデータソースを介した接続プールのプロパティの設定を示します。

PoolDataSource  pds = PoolDataSourceFactory.getPoolDataSource();

pds.setConnectionPoolName("JDBC_UCP");
pds.setMinPoolSize(4);pds.setMaxPoolSize(20);
...

次の例では、接続プール・マネージャを使用して接続プールを作成する場合の接続プールのプロパティの設定を示します。

UniversalConnectionPoolManager mgr = UniversalConnectionPoolManagerImpl.
getUniversalConnectionPoolManager();

pds.setConnectionPoolName("JDBC_UCP");
pds.setMinPoolSize(4);pds.setMaxPoolSize(20);
...

mgr.createConnectionPool(pds);

UCPでのプール・サイズの制御

UCP JDBC接続プールには、プール・サイズの制御に使用される一連のプロパティがあります。これらのプロパティを使用すると、要求の増減につれて、プール内の接続数を増減できるようになります。この動的な動作は、不要な接続の維持に浪費される場合のあるシステム・リソースの節約に役立ちます。

初期プール・サイズの設定

初期プール・サイズのプロパティは、接続プールの初回作成時または再初期化時に作成される使用可能な接続の数を指定します。通常、このプロパティは、プールを最適なサイズにすることで、発生する起動時間を削減するために使用されます。

値0は、接続を事前作成しないことを示します。デフォルト値は0です。次の例では、初期プール・サイズの構成を示します。

pds.setInitialPoolSize(5);

初期プール・サイズのプロパティが最大プール・サイズのプロパティより大きい場合は、最大数の接続のみが初期化されます。

初期プール・サイズのプロパティが最小プール・サイズのプロパティより小さい場合は、初期数の接続のみが初期化され、最小プール・サイズ値を満たす十分な接続が作成されるまで維持されます。

最小プール・サイズの設定

最小プール・サイズのプロパティは、プールが保持する使用可能な接続および流用された接続の最小数を指定します。接続プールがまだ最小サイズに達していない場合を除いて、常に指定された最小プール・サイズに戻ろうとします。たとえば、最小限度が10に設定され、まだ2つの接続しか作成および流用されていない場合は、この数値が最小プール・サイズを下回っているため、プールで保持される接続数は2のままです。

このプロパティを使用すると、要求が減少するにつれてプール内の接続数を減らすことができます。同時に、システム・リソースが不要な接続の維持のために浪費されないようにします。

デフォルト値は0です。次の例では、最小プール・サイズの構成を示します。

pds.setMinPoolSize(2);

最大プール・サイズの設定

最大プール・サイズのプロパティは、プールが保持する使用可能な接続および流用された(使用中の)接続の最大数を指定します。最大数の接続が流用された場合、プールに返されるまで接続は利用できません。

このプロパティを使用すると、要求が増加するにつれてプール内の接続数を増やすことができます。同時に、プールがシステムのリソースを使い果し、最終的にアプリケーションのパフォーマンスや可用性に影響を及ぼすほど大きくならないようにします。

値0は、プールで保持される接続がないことを示します。接続を取得しようとすると例外が発生します。デフォルト値では、最大でInteger.MAX_VALUE(デフォルトでは2147483647)まで接続を作成し続けることができます。次の例では、最大プール・サイズの構成を示します。

pds.setMaxPoolSize(100);

UCPでの失効した接続の制御

失効した接続とは、使用可能であるか流用中であるにもかかわらず、使用されなくなった接続です。流用されたままの失効した接続は、接続の可用性に影響を及ぼすことがあります。また、失効した接続があると、使用されていない接続を長期間維持するためにリソースが浪費されることから、システム・リソースに影響を及ぼすことがあります。この項で説明するプール・プロパティを使用して、失効した接続を制御します。

注意:
アプリケーションで不要になった接続はすべてクローズすることをお薦めします。接続をクローズすると、流用されたままの失効した接続の数を少なくすることができます。

接続再利用の設定

接続再利用機能を使用すると、一定の時間が経過した後または接続が一定の回数使用された後に、接続を適切にクローズして接続プールから削除できます。また、使用できない接続の維持に浪費されることになるシステム・リソースを節約します。

最大接続再使用時間の設定

最大接続再使用時間を使用すると、一定の時間使用された後に、接続を適切にクローズしてプールから削除できます。このプロパティのタイマーは、接続が物理的に作成されると開始します。流用された接続はプールに返された後にしかクローズされないため、再使用時間を超過します。

通常、この機能は、ファイアウォールがプール層とデータベース層の間に存在し、時間制限に基づいて接続をブロックするように設定されている場合に使用されます。ブロックされた接続は、使用できないにもかかわらずプールに残存します。このような場合、接続再使用時間をファイアウォールのタイムアウト・ポリシーより小さい値に設定します。

注意:
最大接続再使用時間は、TTL接続タイムアウトとは異なります。TTL接続タイムアウトは、接続がプールから流用されると開始します。一方、最大接続再使用時間は、接続が物理的に作成されると開始します。また、TTLタイムアウトでは、流用期間中にタイムアウトに達すると、接続をクローズして再利用のためにプールに返します。最大接続再使用時間では、タイムアウトに達すると、接続をクローズしてプールから破棄します。「TTL接続タイムアウトの設定」を参照してください。

最大接続再使用時間の値は秒単位です。値0は、この機能が無効であることを示します。デフォルト値は0です。次の例では、最大接続再使用時間の構成を示します。

pds.setMaxConnectionReuseTime(300);

最大接続再使用数の設定

最大接続再使用数を使用すると、一定の回数流用された後に、接続を適切にクローズして接続プールから削除できます。通常、このプロパティは、メモリー・リークなどの問題を解消するために接続を定期的にリサイクルするために使用されます。

値0は、この機能が無効であることを示します。デフォルト値は0です。次の例では、最大接続再使用数の構成を示します。

pds.setMaxConnectionReuseCount(100);

中止接続タイムアウトの設定

中止接続タイムアウト(ACT)を使用すると、流用された接続が一定時間使用されなかった場合に、接続プールに戻すことができます。中止の決定は、データベースへのコールを監視することで行われます。このタイムアウト機能は、接続再利用が最大限になるようにし、使用されていない流用された接続の維持に浪費されることになるシステム・リソースを節約します。

注意:
UCP for JDBCでは、再利用のために接続を回収する前に、ローカル・トランザクションが保留中である接続を取り消すかロールバックします。

ACT値は秒単位です。値0は、この機能が無効であることを示します。デフォルト値は0に設定されます。次の例では、中止接続タイムアウトの構成を示します。

pds.setAbandonConnectionTimeout(10);

すべての接続が一定時間後にリープされます。ACTに達したとき、またはACTを免れた場合は、その免除の期限が切れるとリープされます。プールにACTを設定した場合は、次のようになります。

- 文に対してStatement.setQueryTimeoutメソッドをコールせずにその文を実行した場合、サーバーが問合せに応答するのを接続が待機していても、ACTを超えると接続はリープされます。

- Statement.setQueryTimeoutメソッドをコールして文を実行した場合、問合せタイムアウトおよびACTに達した後に接続はリープされます。問合せタイムアウトの待機中に、接続はリープされません。問合せタイムアウトの満了は、ACTタイマーをリセットするイベントです。問合せタイムアウトの満了時に発生するcancelアクションの待機中にACTに達した場合、接続はリープされます。

- 1つの接続に、問合せタイムアウトが設定されたs1と問合せタイムアウトが設定されていないs2の2つの文がある場合、s1が問合せタイムアウトを待機している間、ACTによって接続はリープされませんが、s2がハングした場合、接続はリープされます。
2つの文は、JDBCの要件に基づいて順番に実行されることに注意してください。

TTL接続タイムアウトの設定

TTL接続タイムアウトを使用すると、流用された接続を一定時間流用されたままにした後で、接続をプールに回収できます。このタイムアウト機能は、接続が最大限に再利用されるようにし、想定される使用時間よりも長く接続を維持するために浪費されることになるシステム・リソースの節約に役立ちます。

注意:
UCP for JDBCでは、再利用のために接続を回収する前に、ローカル・トランザクションが保留中である接続を取り消すかロールバックします。

TTL接続タイムアウトの値は秒単位です。値0は、この機能が無効であることを示します。デフォルト値は0に設定されます。次の例では、TTL接続タイムアウトの構成を示します。

pds.setTimeToLiveConnectionTimeout(18000)

接続待機タイムアウトの設定

接続待機タイムアウトは、プールに接続がなくなった場合にアプリケーション・リクエストが接続を取得するために待機する時間を指定します。プール内の接続がすべて使用されている(流用されている)場合、およびプール・サイズが最大プール・サイズのプロパティで指定されている最大接続許容数に達している場合、接続プールには接続がなくなります。タイムアウト値に達すると、リクエストはSQL例外を受け取ります。その場合、アプリケーションは接続の取得を再試行できます。このタイムアウト機能により、アプリケーションがブロックされる時間を最小限にすることでアプリケーション全体の有用性が向上し、適切なリカバリを実行できます。

接続待機タイムアウトの値は秒単位です。値0は、この機能が無効であることを示します。デフォルト値は3秒に設定されます。次の例では、接続待機タイムアウトの構成を示します。

pds.setConnectionWaitTimeout(10);

非アクティブ接続タイムアウトの設定

非アクティブ接続タイムアウトは、クローズしてプールから削除されるまでの、使用可能な接続がアイドル状態でいられる時間を指定します。このタイムアウト・プロパティは、使用可能な接続にのみ適用でき、流用された接続には作用しません。このプロパティは、使用されなくなった接続の維持に浪費されることになるリソースの節約に役立ちます。非アクティブ接続タイムアウトを(最大プール・サイズとともに)使用すると、アプリケーション・ロードが変化するにつれて接続プールを拡大または縮小できます。

非アクティブ接続タイムアウトの値は秒単位です。値0は、この機能が無効であることを示します。デフォルト値は0に設定されます。次の例では、非アクティブ接続タイムアウトの構成を示します。

pds.setInactiveConnectionTimeout(60);

タイムアウト・チェック間隔の設定

タイムアウト・チェック間隔プロパティは、タイムアウト・プロパティ(中止接続タイムアウト、TTL接続タイムアウトおよび非アクティブ接続タイムアウト)が適用される頻度を制御します。タイムアウトした接続は、タイムアウト・チェック・サイクルの実行時に回収されます。つまり、接続のタイムアウト時に、実際には接続がプールに回収されないことがあります。接続のタイムアウトと実際の接続の回収の間のラグ・タイムは、タイムアウト・チェック間隔の長さによっては非常に大きい場合があります。

タイムアウト・チェック間隔プロパティは秒単位です。デフォルト値は30に設定されます。次の例では、プロパティ・チェック間隔の構成を示します。

pds.setTimoutCheckInterval(60);

関連項目:
タイムアウトおよびOracle Net Servicesの詳細は、『Oracle Database Net Servicesリファレンス』および『Oracle Database Net Services管理者ガイド』を参照してください

UCPでの接続の獲得

接続獲得機能を使用すると、接続プールが指定された使用可能な接続数に達したときに、指定された数の流用された接続を回収できます。この機能は、プール内で一定数の接続を常に使用可能な状態にし、パフォーマンスの最大化に役立ちます。特に、アプリケーションで接続ハンドルをキャッシュする場合に便利です。通常、キャッシングはパフォーマンス上の理由から実行されます。これは、キャッシングにより、接続がトランザクションに参加するために必要となる状態の再初期化が最小限になるためです。

たとえば、接続はプールから流用され、必要なセッション状態で初期化された後、コンテキスト・オブジェクト内に保持されます。この方法で接続を保持することが、接続プールに使用可能な接続がなくなる原因になる可能性があります。接続獲得機能では、該当する場合に、流用された接続を回収して再利用できるようにします。

接続獲得は、HarvestableConnectionインタフェースを使用して制御し、接続獲得トリガー数と接続獲得最大数の2つのプール・プロパティを使用して構成または有効にします。接続獲得機能を実装するときは、これらのインタフェースおよびプロパティを併用します。

接続が獲得可能かどうかの設定

oracle.ucp.jdbc.HarvestableConnectionインタフェースのsetConnectionHarvestable(boolean)メソッドは、接続を獲得するかどうかを制御します。このメソッドは、接続獲得が有効である場合にロック・メカニズムとして使用されます。たとえば、トランザクション内で接続が使用されていて接続の獲得を禁止する場合、このメソッドを接続に対してfalseに設定します。トランザクションの完了後、このメソッドを接続に対してtrueに設定すると、必要に応じて接続を獲得できます。

注意:
接続獲得機能が有効である場合、デフォルトではすべての接続が獲得可能です。この機能が有効である場合、接続が獲得可能かどうかを明示的に制御するため、setConnectionHarvestableメソッドを常に使用する必要があります。

次の例では、接続獲得機能で接続を獲得しようとしても接続が獲得不可であることを示す、setConnectionHarvestableメソッドの使用例を示しています。

Connection conn = pds.getConnection();

((HarvestableConnection) conn).setConnectionHarvestable(false);

獲得トリガー数の設定

接続獲得トリガー数は、接続獲得をトリガーする使用可能な接続のしきい値を指定します。たとえば、接続獲得トリガー数を10に設定した場合、プール内の使用可能な接続数が10まで減少すると、接続獲得がトリガーされます。

値Integer.MAX_VALUE(デフォルトでは2147483647)は、接続獲得が無効であることを示します。デフォルト値はInteger.MAX_VALUEです。

次の例では、接続獲得トリガー数を構成して接続獲得を有効にしています。

pds.setConnectionHarvestTriggerCount(2);

獲得最大数の設定

接続獲得最大数プロパティは、獲得トリガー数に達した場合に、プールに返す必要がある流用された接続の数を指定します。実際に獲得される接続数は、0から接続獲得最大数の値までのいずれかです。最も長い間使用されていない接続から先に獲得されるため、非常にアクティブなユーザー・セッションが最大限に接続を保つことができます。

獲得最大数の値の範囲は、0から最大接続数プロパティの値までです。デフォルト値は1です。範囲外の値を指定すると、SQL例外がスローされます。

次の例では、接続獲得最大数の構成を示します。

pds.setConnectionHarvestMaxCount(5);

注意:

- 接続獲得機能および中止接続タイムアウト機能が同時に有効になっている場合、タイムアウト処理では、獲得できないとして指定された接続を回収しません。

- 接続獲得機能およびTTL接続タイムアウト機能が同時に有効になっている場合、タイムアウト処理では、獲得できないとして指定された接続を回収します。

中止接続タイムアウト機能およびTTL接続タイムアウト機能の詳細は、第6章を参照してください。

UCPでのSQL文のキャッシング

文キャッシングにより、文の処理はより効率的になります。文キャッシングでは、繰り返し使用される実行可能な文をキャッシングすることでパフォーマンスが向上し、プログラマがコンパイル済の文を明示的に再利用する必要がなくなります。また、繰り返されるカーソルの作成、繰り返される文の分析および作成によるオーバーヘッドを解消し、アプリケーションとデータベース間の通信のオーバーヘッドを削減します。文キャッシングと再利用は、アプリケーションに対して透過的です。各文キャッシュは、物理的な接続に関連付けられます。つまり、物理的な接続はそれぞれ独自の文キャッシュを保有します。

キャッシュされた文の一致条件は次のとおりです。

- 文のSQL文字列は、キャッシュ内のものと同一(大/小文字を区別)である必要があります。

- 文の種類は、キャッシュ内のものと同一(preparedまたはcallable)である必要があります。

- 文によって生成される結果セットのスクロール可能タイプは、キャッシュ内のものと同一(forward-onlyまたはscrollable)である必要があります。

文キャッシングは、JDBCドライバのベンダーによって異なる方法で実装および有効化されます。この項の説明は、OracleのJDBCドライバ固有のものです。他のベンダーのドライバでの文キャッシングは、コネクション・ファクトリで接続プロパティを設定することで構成できます。接続プロパティの設定の詳細は、「接続プロパティの設定」を参照してください。また、JDBCベンダーのドキュメントを参照して、文キャッシングがサポートされているかどうか、接続プロパティとして設定できるかどうかを確認してください。UCP for JDBCでは、JDBCベンダーが文プーリングをサポートする場合は、文プーリングを有効にするためのJDBC 4.0(JDK16)APIがサポートされません。

文キャッシングの有効化

最大文数プロパティは、接続ごとにキャッシュする文の数を指定します。このプロパティは、Oracle JDBCドライバにのみ適用できます。このプロパティを設定しない場合、または0に設定する場合、文キャッシングは無効になります。デフォルトでは、文キャッシングは無効です。文キャッシングを有効にすると、文キャッシュは、接続プールで保持される物理的な接続のそれぞれに関連付けられます。1つの文キャッシュは、すべての物理的な接続で共有されません。

次の例では、文キャッシングの有効化を示します。

pds.setMaxStatements(10);

文キャッシュ・サイズの決定

キャッシュ・サイズは、アプリケーションがデータベースに対して発行する個々の文の数に設定する必要があります。アプリケーションがデータベースに対して発行する文の数が不明な場合、JDBCパフォーマンス・メトリックを使用して文キャッシュ・サイズの決定に役立てます。

文キャッシュ・サイズのリソース問題

接続はそれぞれ独自の文キャッシュに関連付けられます。接続の文キャッシュ内に保持される文が、データベース・リソースを保持し続ける場合があります。オープンされた接続の数と各接続のキャッシュされた文の数の合計が、データベースで許容されるオープン・カーソルの限度を超える可能性があります。この問題は、キャッシュ内で許容される文の数を減らすか、データベースで許容されるオープン・カーソルの限度を増やすかすることで、回避できます。

5 UCPでの接続のラベル付け

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

- UCPでの接続のラベル付けの概要

- UCPでのラベリング・コールバックの実装

- UCPでの接続ラベルの適用

- UCPからのラベル付けされた接続の流用

- UCPでの不一致ラベルのチェック

- DRCPでのUCPの使用

- UCPからの接続ラベルの削除

UCPでの接続のラベル付けの概要

多くの場合、アプリケーションは、接続プールから取得した接続を使用する前に初期化します。初期化は一様ではなく、アプリケーション・コード内でメソッド・コールを必要とする単純な状態の再初期化や、ネットワーク上でのラウンドトリップを必要とするデータベース操作などがあります。このような初期化のコストは非常に高い場合があります。

接続のラベル付けを使用すると、アプリケーションが接続に任意の名前/値のペアを付けることができます。アプリケーションは、必要なラベルが付いた接続を接続プールにリクエストできます。特定のラベルと特定の接続状態を関連付けることで、すでに初期化されている接続をプールから取得し、再初期化の時間とコストを回避できます。接続ラベリング機能は、ユーザー定義キーまたは値に意味を与えません。ユーザー定義キーおよび値の意味は、アプリケーションでのみ定義されます。

接続ラベリングの例には、ロール、NLS言語設定、トランザクション分離レベル、ストアド・プロシージャ・コール、またはリソースによる処理の実行の前に接続上で必要となるその他のコストのかかる状態の初期化があります。

接続ラベリングはアプリケーション駆動型で、2つのインタフェースを使用する必要があります。oracle.ucp.jdbc.LabelableConnectionインタフェースは、接続ラベルの適用および削除と、接続に設定されているラベルの取得に使用されます。oracle.ucp.ConnectionLabelingCallbackインタフェースは、リクエストされたラベルが付いた接続がすでに存在するかどうかを判断するラベリング・コールバックの作成に使用されます。接続が存在しない場合、このインタフェースを使用して、現行の接続を必要に応じて構成できます。これらのインタフェースのメソッドについては、この章全体を通して詳しく説明します。

UCPでのラベリング・コールバックの実装

UCPは、単一のラベルまたは複数のラベルの使用に関係なく、データベース常駐接続プーリング(DRCP)・タグ付けインフラストラクチャを使用して、UCPのラベリングをサポートします。ただし、UCPのみのかわりにUCPおよびDRCPの組合せを使用する場合、複数のラベルを使用した動作は少し異なる可能性があります。

関連項目:
「DRCPでのUCPの使用」

ラベリング・コールバックは、接続プールでラベル付けされた接続を選択する方法を定義するために使用され、アプリケーションに戻す前に、選択された接続の構成ができます。接続ラベリング機能を使用するアプリケーションは、コールバックを実装する必要があります。

ラベリング・コールバックは、ラベル付けされた接続がリクエストされていながら、リクエストされたラベルと一致する接続がプールにない場合に使用されます。コールバックは、リクエストされたラベルと一致するように再構成するために必要となる作業量が最も少ない接続を特定した後、アプリケーションに戻す前に接続ラベルを更新できるようにします。この項の内容は次のとおりです。

- ラベリング・コールバックの作成

- ラベリング・コールバックの登録

- ラベリング・コールバックの削除

ラベリング・コールバックの作成

ラベリング・コールバックを作成するために、アプリケーションはoracle.ucp.ConnectionLabelingCallbackインタフェースを実装します。コールバックは、接続プールごとに1つ作成されます。インタフェースでは、次の2つのメソッドが提供されています。

- costメソッド

- configureメソッド

costメソッド

このメソッドは、ラベルマッチングの相違を考慮に入れて、接続の構成コストを見積ります。接続リクエストが発生すると、接続プールはこのメソッドを使用して、最も構成コストが低い接続を選択します。

public int cost(Properties requestedLabels, Properties currentLabels);

configureメソッド

このメソッドは、アプリケーションに戻す前に、選択された接続に対して接続プールによってコールされます。接続の状態を設定し、接続に対してラベルの適用または削除を行うために、このメソッドが使用されます。

public boolean configure(Properties requestedLabels, Connection conn);

接続プール内で使用可能な各接続に対して繰り返します。接続ごとにcostメソッドをコールします。costメソッドの結果は、接続を必要な状態に再構成するために必要なコストの見積りを表すintegerです。値が大きいほど、接続の再構成にはコストがかかります。接続プールは、常に最も低いコスト値の接続を戻します。アルゴリズムは次のとおりです。

- costメソッドがある接続について0を戻した場合、その接続が適合となります。接続プールは、検出された接続に対してconfigureメソッドをコールせず、その接続をそのまま戻します。

- costメソッドが0より大きい値を戻した場合、コスト値が0の接続を検出するか、使用可能な接続がなくなるまで繰り返します。

- すべての使用可能な接続に対して繰り返して、接続の最低コストがInteger.MAX_VALUE(デフォルトでは2147483647)となった場合、プール内に接続リクエストを満たす接続はありません。プールは新しい接続を作成して戻します。プールが最大プール・サイズに達している(新しい接続を作成できない)場合は、SQL例外をスローするか、接続待機タイムアウト属性が指定されていれば待機するかのいずれかです。

- すべての使用可能な接続に対して繰り返して、接続の最低コストがInteger.MAX_VALUEよりも低い場合、その接続に対してconfigureメソッドをコールし、その接続を戻します。複数の接続がInteger.MAX_VALUEを下回る場合は、最低コストの接続を戻します。

注意:
コスト0は、requestedLabelsとcurrentLabelsが等しいという意味ではありません。

ラベリング・コールバックの例

次の例では、costとconfigureの両メソッドを実装する単純なラベリング・コールバックの実装を示します。このコールバックは、特定のトランザクション分離レベルで初期化されるラベル付けされた接続の検出に使用されます。

class MyConnectionLabelingCallback
implements ConnectionLabelingCallback {

public MyConnectionLabelingCallback()
{
}

public int cost(Properties reqLabels, Properties currentLabels)
{
// Case 1: exact match
if (reqLabels.equals(currentLabels))
{
System.out.println("## Exact match found!! ##");
return 0;
}

// Case 2: some labels match with no unmatched labels
String iso1 = (String) reqLabels.get("TRANSACTION_ISOLATION");
String iso2 = (String) currentLabels.get("TRANSACTION_ISOLATION");
boolean match =
(iso1 != null && iso2 != null && iso1.equalsIgnoreCase(iso2));
Set rKeys = reqLabels.keySet();
Set cKeys = currentLabels.keySet();
if (match && rKeys.containsAll(cKeys))
{
System.out.println("## Partial match found!! ##");
return 10;
}

// No label matches to application's preference.
// Do not choose this connection.
System.out.println("## No match found!! ##");
return Integer.MAX_VALUE;
}

public boolean configure(Properties reqLabels, Object conn)
{
try
{
String isoStr = (String) reqLabels.get("TRANSACTION_ISOLATION");
((Connection)conn).setTransactionIsolation(Integer.valueOf(isoStr));
LabelableConnection lconn = (LabelableConnection) conn;

// Find the unmatched labels on this connection
Properties unmatchedLabels =
lconn.getUnmatchedConnectionLabels(reqLabels);

// Apply each label <key,value> in unmatchedLabels to conn
for (Map.Entry<Object, Object> label : unmatchedLabels.entrySet())
{
String key = (String) label.getKey();
String value = (String) label.getValue();
lconn.applyConnectionLabel(key, value);
}
}
catch (Exception exc)
{
return false;
}
return true;
}
}

ラベリング・コールバックの登録

プール対応のデータソースは、ラベリング・コールバックを登録するためのregisterConnectionLabelingCallback(ConnectionLabelingCallback callback)メソッドを備えています。1つの接続プールに登録できるコールバックは1つのみです。次の例では、MyConnectionLabelingCallbackクラスに実装されているラベリング・コールバックの登録を示します。

MyConnectionLabelingCallback callback = new MyConnectionLabelingCallback();
pds.registerConnectionLabelingCallback( callback );

ラベリング・コールバックの削除

プール対応のデータソースは、ラベリング・コールバックを削除するためのremoveConnectionLabelingCallback()メソッドを備えています。次の例では、ラベリング・コールバックの削除を示します。

pds.removeConnectionLabelingCallback( callback );

DRCPでのUCPの使用

DRCPは、重みのない単一のラベルである接続のタグ付けをネイティブにサポートします。そのため、DRCPでUCPを使用する場合、単一のラベルを使用したラベル付けは透過的に動作します。複数のラベルのUCP接続は動作しますが、次の動作変更があります。

- 接続ラベリングを使用してDRCPでUCPを使用する場合、ConnectionLabelingCallback APIのcostメソッドは起動しません。

- UCPは、DRCP構成なしではなくDRCP構成ありでConnectionLabelingCallback APIのconfigureメソッドを起動できます。

関連項目:
DRCPの詳細は、『Oracle Database JDBC開発者ガイド』を参照してください。

UCPでの接続ラベルの適用

ラベルは、LabelableConnectionインタフェースのapplyConnectionLabelメソッドを使用して、流用された接続に適用されます。通常、このメソッドは、ラベリング・コールバックのconfigureメソッドからコールされます。任意の数の接続ラベルを流用された接続に累積的に適用できます。ラベルが接続に適用されるたびに、指定されたキー/値のペアが、すでに接続に適用されているラベルのコレクションに追加されます。最後に適用された値のみがどのキーに対しても保持されます。

注意:
流用された接続にラベルを適用するには、ラベリング・コールバックを接続プールに登録する必要があります。登録しないと例外がスローされます。「UCPでのラベリング・コールバックの実装」を参照してください。

次の例では、トランザクション分離レベルで接続を初期化した後、ラベルを接続に適用しています。

String pname = "property1";
String pvalue = "value";
Connection conn = pds.getConnection();

// initialize the connection as required.

conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);

((LabelableConnection) conn).applyConnectionLabel(pname, pvalue);

特定のキーを適用済の接続ラベルのセットから削除するには、削除するキーおよびnull値のラベルを適用します。この方法は、接続ラベルのセットから特定のキー/値ペアを消去するために使用できます。

UCPからのラベル付けされた接続の流用

プール対応のデータソースは、ラベル付けされた接続をプールから流用するために使用される2つのgetConnectionメソッドを備えています。これらのメソッドを次に示します。

public Connection getConnection(java.util.Properties labels )
throws SQLException;

public Connection getConnection( String user, String password,
java.util.Properties labels )
throws SQLException;

これらのメソッドには、getConnectionメソッドにPropertiesオブジェクトとして渡すラベルが必要です。次の例では、property1, valueというラベルが付いた接続の取得を示します。

String pname = "property1";
String pvalue = "value";
Properties label = new Properties();
label.setProperty(pname, pvalue);

Connection conn = pds.getConnection(label);

UCPでの不一致ラベルのチェック

1つの接続は複数のラベルを保有できます。各ラベルは目的とする条件に基づいて一意に接続を識別します。getUnmatchedConnectionLabelsメソッドは、リクエストされたラベルから、どの接続ラベルが一致してどの接続ラベルが一致しなかったかを検証するために使用されます。このメソッドは、複数のラベルを持つ接続が接続プールから流用された後に使用され、通常、ラベリング・コールバックで使用されます。次の例では、不一致ラベルのチェックを示します。

String pname = "property1";
String pvalue = "value";
Properties label = new Properties();
label.setProperty(pname, pvalue);

Connecion conn = pds.getConnection(label);
Properties unmatched = ((LabelableConnection)
connection).getUnmatchedConnectionLabels (label);

UCPからの接続ラベルの削除

removeConnectionLabelメソッドは、接続からラベルを削除するために使用されます。このメソッドは、ラベル付けされた接続が接続プールから流用された後に使用されます。次の例では、接続ラベルの削除を示します。

String pname = "property1";
String pvalue = "value";
Properties label = new Properties();
label.setProperty(pname, pvalue);
Connection conn = pds.getConnection(label);
((LabelableConnection) conn).removeConnectionLabel(pname);

6 再利用可能な接続の動作の制御

この章では、次のインタフェースについて説明します。

- AbandonedConnectionTimeoutCallback

- TimeToLiveConnectionTimeoutCallback

AbandonedConnectionTimeoutCallback

AbandonedConnectionTimeoutCallbackコールバック・インタフェースは中止接続タイムアウト機能に使用します。この機能により、アプリケーションは中止接続をカスタマイズ処理できます。コールバック・オブジェクトは論理接続プロキシのいずれかを使用するか、または各プール接続に登録されます。これにより、特定の接続が中止されたとプールによってみなされた場合、アプリケーションはカスタマイズ処理を実行できます。流用された接続が中止されたとユニバーサル接続プールによってみなされた場合、handleTimedOutConnectionメソッドが起動されます。アプリケーションは接続に対して次の操作のいずれかを実行できます。

- プール処理プロセスの完全な上書き

- 追加の処理アクションの起動

- デフォルトのプール処理の想定

JDBCアプリケーションは、handleTimedOutConnectionメソッド内でcancel、closeおよびrollbackメソッドを中止接続に対して起動できます。

注意:
同じ接続に複数のAbandonedConnectionTimeoutCallbackインタフェースを登録しようとすると、例外が発生します。この例外は、プール・レイヤーにおけるUniversalConnectionPoolExceptionか、JDBC、JCAなどのUCPアダプタのタイプに固有のjava.sql.SQLExceptionのいずれかです。

TimeToLiveConnectionTimeoutCallback

TimeToLiveConnectionTimeoutCallbackコールバック・インタフェースはTTL接続タイムアウト機能に使用します。これにより、アプリケーションはTTLタイムアウト接続をカスタマイズ処理できます。

コールバック・オブジェクトは論理接続プロキシのいずれかを使用するか、または各プール接続に登録されます。これにより、特定のTTL接続がタイムアウトになった場合、アプリケーションはカスタマイズ処理を実行できます。

流用された接続がTTLタイムアウトになったとユニバーサル接続プールによって検出された場合、handleTimedOutConnectionメソッドが起動されます。アプリケーションは接続に対して次の操作のいずれかを実行できます。

- プール処理プロセスの完全な上書き

- 追加の処理アクションの起動

- デフォルトのプール処理の想定

JDBCアプリケーションは、handleTimedOutConnectionメソッド内でcancel、closeおよびrollbackメソッドを中止接続に対して起動できます。

注意:
同じ接続に複数のTimeToLiveConnectionTimeoutCallbackインタフェースを登録すると、例外が発生します。この例外は、プール・レイヤーにおけるUniversalConnectionPoolExceptionであるか、JDBC、JCAなどのUCPアダプタのタイプに固有のjava.sql.SQLExceptionです。

7 接続プール・マネージャの使用方法

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

- UCPマネージャの使用方法

- JMXベース管理へのアクセス

UCPマネージャの使用方法

ユニバーサル接続プール(UCP)マネージャはUCPインスタンスを作成し維持します。新しいプールが作成されるたびに、プール・インスタンスがプール・マネージャに登録されます。この項では、次の項目について説明します。

- 接続プール・マネージャの概要

- 接続プール・マネージャの作成

- 接続のライフ・サイクルの制御

- 接続プールに対するメンテナンスの実行

接続プール・マネージャの概要

アプリケーションは、接続プール・マネージャを使用してUCP JDBC接続プールを明示的に作成および管理します。アプリケーションでマネージャを使用するのは、接続プールの作成、起動、停止、破棄などのライフ・サイクルを完全に制御できるためです。また、マネージャを使用して、接続プール内の接続のリフレッシュ、リサイクル、パージなどの定期的なメンテナンスを実行します。最後に、管理ツールおよびコンソールの集中統合ポイントにできることから、接続プール・マネージャを使用します。

接続プール・マネージャの作成

接続プール・マネージャは、oracle.ucp.adminパッケージにあるUniversalConnectionPoolManagerインタフェースのインスタンスです。マネージャは、JVMごとに複数の接続プールを管理するために使用されるシングルトン・インスタンスです。このインタフェースは、接続プール・マネージャとやりとりするためのメソッドを備えています。UCP for JDBCには、接続プール・マネージャ・インスタンスの取得に使用される実装があります。次の例では、その実装を使用した接続プール・マネージャ・インスタンスの作成を示します。

UniversalConnectionPoolManager mgr = UniversalConnectionPoolManagerImpl.
getUniversalConnectionPoolManager();

接続のライフ・サイクルの制御

アプリケーションは、接続プール・マネージャを使用して接続プールのライフ・サイクルを明示的に制御します。マネージャは、接続プールの作成、起動、停止および破棄に使用されます。ライフ・サイクル・メソッドは、UniversalConnectionPoolManagerインタフェースの一部として含まれます。

ライフ・サイクルの状態について

接続プールのライフ・サイクルの状態は、接続プールに対して実行できるマネージャ操作に影響を与えます。プールのライフ・サイクルを明示的に制御するアプリケーションでは、プールが適切な状態にある場合にのみ、マネージャの操作が使用されるようにする必要があります。ライフ・サイクルの制約については、この項全体を通して説明します。

プールのライフ・サイクルの状態を次に示します。

- 起動中: 接続プールの起動メソッドがコールされ、起動中であることを示します。

- 実行中: 接続プールが起動され、接続の割当て準備ができていることを示します。

- 停止中: 接続プールが停止中であることを示します。

- 停止済: 接続プールが停止していることを示します。

- 失敗: 起動、停止または実行中に、接続プールで障害が発生したことを示します。

接続プールの作成

マネージャのCreateConnectionPoolメソッドにより、接続プールは作成および登録されます。マネージャは、接続プール・アダプタを使用してプールを作成し、プール対応のデータソースを利用してプール・プロパティを構成します。接続プール名は、構成の一環として定義する必要があり、マネージャとやりとりする際に特定のプールを参照する方法となります。接続プール名は一意である必要があり、複数の接続プールで使用することはできません。

次の例では、マネージャを使用する場合の接続プール・インスタンスの作成を示します。

UniversalConnectionPoolManager mgr = UniversalConnectionPoolManagerImpl.
getUniversalConnectionPoolManager();

PoolDataSource  pds = PoolDataSourceFactory.getPoolDataSource();
pds.setConnectionPoolName("mgr_pool");
pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");
pds.setURL("jdbc:oracle:thin:@//localhost:1521/XE");
pds.setUser("<user>");
pds.setPassword("<password>");

mgr.createConnectionPool((UniversalConnectionPoolAdapter)pds);

管理のためマネージャを使用してプールを作成する必要はありません。暗黙的に作成され(プール対応のデータソースの使用時に自動的に作成され)、プール名を使用して構成されたプールも、プール・マネージャによって自動的に登録および管理されます。暗黙的なプールの作成をお薦めします。

注意:
同じ名前の接続プールがすでに存在する場合、マネージャは例外をスローします。アプリケーションで接続プールを暗黙的に起動してから、createConnectionPoolメソッドを使用して明示的に同じ名前のプールを作成しないでください。

接続プールの起動

マネージャのstartConnectionPoolメソッドで接続プールが起動されます。起動するプールを特定するために、プール名がパラメータとして使用されます。プール名は、プール・プロパティとしてプール対応のデータソースで定義されます。

次の例では、接続プールの起動を示します。

mgr.startConnectionPool("mgr_pool");

アプリケーションでは、常にマネージャのcreateConnectionPoolメソッドを使用して接続プールを作成してからプールを起動する必要があります。また、アプリケーションですでに起動されているプールを起動しようとした場合、つまりプールが停止済または失敗以外のステータスである場合は、ライフ・サイクルの状態例外が発生します。

接続プールの停止

マネージャのstopConnectionPoolメソッドで接続プールが停止されます。停止するプールを特定するために、プール名がパラメータとして使用されます。プール名は、プール・プロパティとしてプール対応のデータソースで定義されます。接続プールを停止すると、すべての使用可能な接続および流用された接続はクローズされます。

次の例では、接続プールの停止を示します。

mgr.stopConnectionPool("mgr_pool");

アプリケーションでは、マネージャを使用して暗黙的または明示的に起動された接続プールを停止できます。存在しないプールを停止しようとした場合、またはプールが起動済または起動中以外の状態である場合は、エラーが発生します。

接続プールの破棄

マネージャのdestroyConnectionPoolメソッドで接続プールは停止され、接続プール・マネージャから削除されます。破棄するプールを特定するために、プール名がパラメータとして使用されます。プール名は、プール・プロパティとしてプール対応のデータソースで定義されます。

次の例では、接続プールの破棄を示します。

mgr.destroyConnectionPool("mgr_pool");

アプリケーションでは、破棄された接続プールは起動できません。新しい接続プールを明示的に作成および起動する必要があります。

接続プールに対するメンテナンスの実行

アプリケーションでは、接続プール・マネージャを使用して接続プールでメンテナンスを実行します。メンテナンスには、接続プールのリフレッシュ、リサイクルおよびパージがあります。メンテナンス・メソッドは、UniversalConnectionPoolManagerインタフェースの一部として含まれます。

通常、メンテナンスは無効な接続を削除および置換し、有効な接続の高い可用性を確保するために実行します。一般に、無効な接続はデータベースへの接続に使用できませんが、プールで維持され続けます。このような接続はシステム・リソースを浪費し、プールの最大接続数制限に直接影響を及ぼします。最終的には、多すぎる無効な接続によってアプリケーション・パフォーマンスが悪化します。

注意:
アプリケーションでは、プールから接続を流用する際に接続が有効かどうかをチェックできます。詳細は、「UCPでの接続の検証」を参照してください。アプリケーションでの無効な接続の数が常に多い場合、追加テストを実行して原因を特定する必要があります。

接続プールのリフレッシュ

接続プールをリフレッシュすると、プール内のすべての接続が新しい接続に置き換えられます。現在流用されている接続には削除マークが付けられ、接続がプールに返された後にリフレッシュされます。マネージャのrefreshConnectionPoolメソッドで接続プールがリフレッシュされます。リフレッシュするプールを特定するために、プール名がパラメータとして使用されます。プール名は、プール・プロパティとしてプール対応のデータソースで定義されます。

次の例では、接続プールのリフレッシュを示します。

mgr.refreshConnectionPool("mgr_pool");

接続プールのリサイクル

接続プールをリサイクルすると、プール内の無効な接続のみが新しい接続に置き換えられ、流用された接続は置き換えられません。マネージャのrecycleConnectionPoolメソッドで接続プールがリサイクルされます。リサイクルするプールを特定するために、プール名がパラメータとして使用されます。プール名は、プール・プロパティとしてプール対応のデータソースで定義されます。

Oracle以外のドライバを使用する場合は、setSQLForValidateConnectionプロパティを設定する必要があります。UCP for JDBCではこのプロパティを使用して、接続をリサイクルする前に接続が有効かどうかを判断します。setSQLForValidateConnectionプロパティの使用方法は、「UCPでの接続の検証」を参照してください。

次の例では、接続プールのリサイクルを示します。

mgr.recycleConnectionPool("mgr_pool");

接続プールのパージ

接続プールをパージすると、すべての接続(使用可能な接続および流用された接続)が接続プールから削除され、接続プールを空の状態にします。後続の接続リクエストにより、新しい接続が作成されます。マネージャのpurgeConnectionPoolメソッドで接続プールがパージされます。パージするプールを特定するために、プール名がパラメータとして使用されます。プール名は、プール・プロパティとしてプール対応のデータソースで定義されます。

次の例では、接続プールのパージを示します。

mgr.purgeConnectionPool("mgr_pool");

注意:
minPoolSizeやinitialPoolSizeなどの接続プールのプロパティは、接続プールのパージ後に実行できないことがあります。

JMXベース管理へのアクセス

Java Management Extensions(JMX)はJavaテクノロジであり、アプリケーション、システム・オブジェクト、デバイス、サービス指向ネットワークおよびJava仮想マシン(JVM)の管理と監視のためのツールを提供します。このAPIでは、クラスを動的に作成し変更できます。そのため、このテクノロジを使用すると、作成、インストールおよび実装されたリソースを監視および管理できます。JMX APIにもリモート・アクセスが含まれているため、リモート管理プログラムがこれらの目的のために実行中のアプリケーションとやりとりすることができます。

JMXでは、指定されたリソースが、マネージドBean(MBean)と呼ばれる1つ以上のJavaオブジェクトによってインスツルメントされています。これらのMBeanは、管理エージェントとして機能するMBeanサーバーと呼ばれるコア管理オブジェクト・サーバーに登録され、Javaプログラミング言語に対応した多くのデバイスで実行できます。JMXエージェントは、MBeanが登録されるMBeanサーバーおよびMBeanを処理する一連のサービスから構成されます。

UniversalConnectionPoolManager.isJmxEnabledメソッドがtrueを返した場合にのみ、すべてのMBean属性および操作を使用できます。このフラグのデフォルト値はtrueです。このデフォルト値は、UniversalConnectionPoolManager.setJmxEnabledメソッドをコールすることによって変更できます。MBeanServerを使用できない場合、自動的にfalseがjmxFlagに設定されます。

関連項目:
『Oracle Universal Connection Pool for JDBC Java API Reference』

UCPには、プール管理サポートのために次の2つのMBeanがあります。

- UniversalConnectionPoolManagerMBean

- UniversalConnectionPoolMBean

UniversalConnectionPoolManagerMBean

UniversalConnectionPoolManagerMBeanは、従来の接続プール・マネージャの機能がすべて含まれているマネージャMBeanです。UniversalConnectionPoolManagerMBeanは次の機能を提供します。

- プールMBeanの登録および登録解除

- プールの起動、停止、リフレッシュなどのプール管理操作

- DMS統計の起動と停止

- ロギング

UniversalConnectionPoolMBean

UniversalConnectionPoolMBeanは、プールのプロパティおよびプールの統計情報の動的な構成に対応します。UniversalConnectionPoolMBeanは次の機能を提供します。

- サイズ、タイムアウトなどのプールのプロパティの属性の構成

- プールのリフレッシュ、リサイクルなどのプール管理操作

- プールの統計情報およびライフ・サイクルの状態の監視

8 Oracle RAC機能の使用方法

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

- 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機能でサポートされています。

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

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

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

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

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

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

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

- ONSの構成

- 接続URLの構成

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

高速接続フェイルオーバー(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.oraclehomeがORACLE_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構成は、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つの方法で設定できます。

- 名前は、nodes、walletfile、walletpasswordのいずれかです。パラメータ文字列では、少なくとも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インスタンスを選択して最初の接続を作成すると、後続の接続は同じインスタンスへのアフィニティを使用して作成されます。

関連項目:

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

- Oracle RACデータベースの設定の詳細は、『Oracle Real Application Clusters管理およびデプロイメント・ガイド』を参照してください。

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

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

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

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

トランザクションベースのアフィニティは、クライアント・アプリケーションまたは障害イベントによって解放できる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セッション・アフィニティを使用してパフォーマンスを向上させますが、接続が別のインスタンスにリダイレクトされても相対的に影響を受けません。

接続アフィニティの設定

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

- FCFを有効にします。

関連項目:
「高速接続フェイルオーバーの使用」

- 実行時接続ロード・バランシングを有効にします。

関連項目:
「実行時接続ロード・バランシングの使用方法」

- 接続アフィニティ・コールバックを作成します。

- コールバックを登録します。

注意:
トランザクションベースのアフィニティは、アプリケーション/中間層および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を使用して、これらのプロパティを処理できます。

関連項目:
「UniversalConnectionPoolMBean」

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

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

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

- 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ウォレットまたはキーストア・パラメータの追加

9 アプリケーション・コンティニュイティの保証

Oracle Database 12cリリース1 (12.1)では、アプリケーション・コンティニュイティ機能を導入し、汎用のアプリケーションに依存しないインフラストラクチャを提供しています。アプリケーション・コンティニュイティを使用すると、修復、構成変更またはパッチ適用後のシステム、通信またはハードウェアに関連している可能性がある計画停止または計画外停止の発生後に、アプリケーションの面から作業のリカバリが可能になります。

関連項目:
アプリケーション・コンティニュイティの詳細は、『Oracle Database開発ガイド』を参照してください

アプリケーション・コンティニュイティを使用するには、「データソースの構成」で説明されているように、まずデータソースを構成する必要があります。その後に、次の2つの機能のいずれかを使用して、Universal Connection Pool (UCP) for JDBCを使用するアプリケーションでアプリケーション・コンティニュイティを実装します。

- 接続ラベリング

- 接続初期化コールバック

データソースの構成

プール対応のデータソースでアプリケーション・コンティニュイティ機能を使用にするには、アプリケーションでoracle.ucp.jdbc.PoolDataSourceインタフェースに対して次のコールを実行する必要があります。

// pds is a PoolDataSource
pds.setConnectionFactoryClassName("oracle.jdbc.replay.OracleDataSourceImpl");

関連項目:
「プール対応のデータソースの使用方法」

SIDを使用するかわりに、常にサービスに接続します。SID構文で接続する場合、アプリケーション・コンティニュイティはサポートされません。

関連項目:
アプリケーション・コンティニュイティの詳細は、『Oracle Database開発ガイド』を参照してください

Oracle Real Application Clusters(Oracle RAC)またはData Guardに対して実行する場合、次のコード・スニペットに示されている高速接続フェイルオーバー(FCF)も有効にする必要があります。

pds.setFastConnectionFailoverEnabled(true);

関連項目:
詳細は、「高速接続フェイルオーバーの有効化」を参照してください

接続ラベリング

接続ラベリングを使用すると、アプリケーションが接続に任意の名前/値のペアを付けることができます。アプリケーションは、必要なラベルが付いた接続を接続プールにリクエストできます。

関連項目:
接続のラベル付けの詳細は、「UCPでの接続のラベル付け」を参照してください

接続ラベリングは、接続リクエストごとに初期状態を設定します。アプリケーションが接続ラベリングを使用したり、接続のラベル付けを利用する場合、フェイルオーバー時にクリーン接続を初期化するには、ラベリング・コールバックをアプリケーション・コンティニュイティ用に登録する必要があります。

アプリケーション・コンティニュイティが基礎となるデータソースから新しい接続を取得するたびに、ラベリング・コールバックが実行されます。コールバックは、通常の接続チェックアウト中およびリプレイ中に実行されます。そのため、実行時に作成される状態は、リプレイ時に確実に再作成されます。初期化は冪等にする必要があります。

コールバック呼出しの最後にトランザクションが完了(コミットまたはロールバック)するかぎり、コールバックでトランザクションを実行することは有効です。アプリケーション・コンティニュイティは、このようなトランザクションを含め、コールバック実装内にコーディングされたアクションを繰り返します。停止がUCPラベリング・コールバックの実行中に発生する場合、アプリケーション・コンティニュイティがリプレイ試行の一部として複数回コールバックを実行することがあります。また、コールバック・アクションを同等にすることが重要です。

接続初期化コールバック

変更できないため、アプリケーションで接続ラベリングを使用しない場合、このようなアプリケーションには接続初期化コールバックが提供されます。

登録されると、接続がプールから流用されるたびに、またリカバリ可能なエラー後に再接続が成功するたびに、初期化コールバックは実行されます。接続初期化コールバックの使用の詳細は、「接続初期化コールバック」を参照してください。

10 接続プールの診断

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

- プールの統計情報

- ダイナミック・モニタリング・サービス・メトリック

- Oracle RACの統計情報の表示

- UCPでのロギングの設定

- 例外およびエラー・コード

プールの統計情報

Universal Connection Pool (UCP) for JDBCでは、接続プールの実行時統計情報を提供します。これらの統計情報は次の2つのカテゴリに分かれます。

- 非累積
これらの統計情報は現在実行中の接続プール・インスタンスにのみ適用されます。

- 累積
これらの統計情報はプールの起動または停止の複数のサイクルにわたって収集されます。

oracle.ucp.UniversalConnectionPoolStatisticsインタフェースは、接続プール統計情報を問い合せるために使用されるメソッドを備えています。このインタフェースのメソッドは、oracle.ucp.jdbc.PoolDataSource.getStatisticsメソッドを使用して、プール対応のデータソースおよびプール対応のXAデータソースからコールできます。次に例を示します。

PoolDataSource pds = PoolDataSourceFactory.getPoolDataSource();
...
...
int totalConnsCount = pds.getStatistics().getTotalConnectionsCount();
System.out.println("The total connetion count in the pool is "+ totalConnsCount +".");

oracle.ucp.jdbc.PoolDataSource.getStatisticsメソッドは、それ自体でコールすることも可能であり、接続プールの全統計情報を1つのStringとして戻します。

ダイナミック・モニタリング・サービス・メトリック

UCPは、すべてのプールの統計情報をダイナミック・モニタリング・サービス(DMS)メトリックの形式にするようにサポートしています。これらのDMSメトリックを収集し利用するには、アプリケーションのクラス・パスにdms.jarファイルを含める必要があります。

UCPは、プール・マネージャ・インタフェースとプール・マネージャMBeanの両方でDMSメトリックの収集をサポートしています。UnversalConnectionPoolManager.startMetricsCollectionメソッドを使用すると、特定の接続プール・インスタンスに対してDMSメトリックの収集を開始でき、UnversalConnectionPoolManager.stopMetricsCollectionメソッドを使用すると、DMSメトリックの収集を停止できます。メトリックの更新間隔は、UnversalConnectionPoolManager.setMetricUpdateIntervalメソッドを使用して指定できます。プール・マネージャMBeanは同様の操作をエクスポートします。

Oracle RACの統計情報の表示

UCP for JDBCは、一連のOracle RACの実行時統計情報を提供します。この統計情報は、接続プールがOracle RAC機能をどの程度利用しているか判断するために使用されます。また、Oracle RAC機能を使用するために接続プールが適切に構成されているかどうかの判断に役立てるためにも使用されます。統計情報には、FCF処理情報、実行時接続ロード・バランスの成否率、アフィニティ・コンテキストの成否率がレポートされます。

oracle.ucp.jdbc.oracleパッケージにあるOracleJDBCConnectionPoolStatisticsインタフェースは、Oracle RACの統計情報を接続プールに問い合せるために使用されるメソッドを備えています。このインタフェースのメソッドは、データソースのgetStatisticsメソッドを使用して、プール対応のデータソースおよびプール対応のXAデータソースからコールできます。次に例を示します。

PoolDataSource  pds = PoolDataSourceFactory.getPoolDataSource();
...

Long rclbS = ((OracleJDBCConnectionPoolStatistics)pds.getStatistics()).
getSuccessfulRCLBBasedBorrowCount();
System.out.println("The RCLB success rate is "+rclbS+".");

データソースのgetStatisticsメソッドは、それ自身でコールすることも可能であり、接続プールの全統計情報を1つのStringとして戻し、Oracle RACの統計情報を組み込みます。

高速接続フェイルオーバーの統計情報

getFCFProcessingInfoメソッドは、最新の高速接続フェイルオーバー(FCF)の試行に関する情報をStringの形式で提供します。通常、FCFの情報は、FCFの問題の診断に役立てるために使用されます。この情報は、各FCFの試行結果(成功または失敗)、関連するOracle RACインスタンス、クリーンアップされた接続数、FCFの試行の失敗をトリガーした例外などで構成されます。次の例では、getFCFProcessingInfoメソッドの使用方法を示します。

Sting fcfInfo = ((OracleJDBCConnectionPoolStatistics)pds.getStatistics()).
getFCFProcessingInfo();
System.out.println("The FCF information: "+fcfInfo+".");

次の例では、getFCFProcessingInfo()メソッドの出力文字列を示します。

Oct 28, 2008 12:34:02 SUCCESS <Reason:planned> <Type:SERVICE_UP> \
<Service:"svvc1"> <Instance:"inst1"> <Db:"db1"> \
Connections:(Available=6 Affected=2 FailedToProcess=0 MarkedDown=2 Closed=2) \
(Borrowed=6 Affected=2 FailedToProcess=0 MarkedDown=2 MarkedDeferredClose=0 Closed=2) \
TornDown=2 MarkedToClose=2 Cardinality=2
...
Oct 28, 2008 12:09:52 SUCCESS <Reason:unplanned> <Type:SERVICE_DOWN> \
<Service:"svc1"> <Instance:"inst1"> <Db:"db1"> \
Connections:(Available=6 Affected=2 FailedToProcess=0 MarkedDown=2 Closed=2) \
(Borrowed=6 Affected=2 FailedToProcess=0 MarkedDown=2 MarkedDeferredClose=0 Closed=2)
...
Oct 28, 2008 11:14:53 FAILURE <Type:HOST_DOWN> <Host:"host1"> \
Connections:(Available=6 Affected=4 FailedToProcess=0 MarkedDown=4 Closed=4) \
(Borrowed=6 Affected=4 FailedToProcess=0 MarkedDown=4 MarkedDeferredClose=0 Closed=4)

ロギングを有効にしている場合、前述の情報はUCPログでも利用でき、FCFの結果を検証できます。

実行時接続ロード・バランスの統計情報

実行時接続ロード・バランスの統計情報は、接続プールがOracle RACの実行時接続ロード・バランシング機能を効率的に利用しているかどうかの判断に使用されます。この統計情報には、実行時接続ロード・バランシングのアルゴリズムを利用できたリクエストの数と、アルゴリズムを利用できなかったリクエストの数がレポートされます。getSuccessfulRCLBBasedBorrowCountメソッドとgetFailedRCLBBasedBorrowCountメソッドが、それぞれの統計情報の取得に使用されます。次の例では、getFailedRCLBBasedBorrowCountメソッドの使用方法を示します。

Long rclbF = ((OracleJDBCConnectionPoolStatistics)pds.getStatistics()).
getFailedRCLBBasedBorrowCount();
System.out.println("The RCLB failure rate is: "+rclbF+".");

失敗率が高い場合は、Oracle RACロード・バランシング・アドバイザまたは接続プールが適切に構成されていないことを示している可能性があります。

接続アフィニティの統計情報

接続アフィニティの統計情報は、接続プールが接続アフィニティを効率的に利用しているかどうかの判断に使用されます。この統計情報には、アフィニティ・コンテキストと一致した流用リクエストの数と、アフィニティ・コンテキストと一致しなかったリクエストの数がレポートされます。getSuccessfulAffinityBasedBorrowCountメソッドとgetFailedAffinityBasedBorrowCountメソッドが、それぞれの統計情報の取得に使用されます。次の例では、getFailedAffinityBasedBorrowCountメソッドの使用方法を示します。

Long affF = ((OracleJDBCConnectionPoolStatistics)pds.getStatistics()).
getFailedAffinityBasedBorrowCount();
System.out.println("The connection affinity failure rate is: "+affF+".");

UCPでのロギングの設定

UCP for JDBCは、JDKロギング機能(java.util.logging)を利用しています。ロギングは、デフォルトでは無効になっており、ログ・メッセージを出力するために構成する必要があります。ロギングは、ログ構成ファイルを使用するか、APIレベルの構成を使用して、構成できます。

注意:
デフォルトのログ・レベルはnullです。そのため、デフォルトでは親のログ出力でのログ・レベルが必ず使用されます。

ロギング・プロパティ・ファイルの使用方法

ロギングは、プロパティ・ファイルを使用して構成できます。プロパティ・ファイルの場所は、ロギング構成ファイル・プロパティのJavaプロパティとして設定する必要があります。次に例を示します。

java -Djava.util.logging.config.file=log.properties

ロギング・プロパティ・ファイルは、ログの書込みに使用するハンドラ、ログの書式設定に使用するフォーマッタ、デフォルトのログ・レベルの他、特定のパッケージおよびクラスのログ・レベルを定義します。次に例を示します。

handlers = java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level = ALL
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

oracle.ucp.level = FINEST
oracle.ucp.jdbc.PoolDataSource = WARNING

カスタム・フォーマッタは、UCP for JDBCに同梱されており、フォーマッタ・プロパティの値として入力できます。次に例を示します。

java.util.logging.ConsoleHandler.formatter = oracle.ucp.util.logging.UCPFormatter

Oracle Technology Network(OTN)から、UCPに用意されているucpdemos.jarファイルをダウンロードすることもできます。このファイルにはサンプルのロギング・プロパティ・ファイルのリストがあります。たとえば、このファイルには、高速接続フェイルオーバー(FCF)機能のトラブルシューティングに使用できるロギング・プロパティ・ファイルがあります。

UCP for JDBC APIおよびJDK APIの使用方法

ロギングは、UCP for JDBC APIまたはJDK APIのいずれかを使用して動的に構成できます。UCP for JDBC APIを使用する場合は、接続プール・マネージャを使用してロギングを構成します。JDKを使用する場合は、java.util.logging実装を使用してロギングを構成します。

次の例では、UCP for JDBC APIを使用してロギングを構成しています。

UniversalConnectionPoolManager mgr = UniversalConnectionPoolManagerImpl.
getUniversalConnectionPoolManager();

mgr.setLogLevel(Level.FINE);

次の例では、JDKロギング実装を直接使用しています。

Logger.getLogger("oracle.ucp").setLevel(Level.FINEST);
Logger.getLogger("oracle.ucp.jdbc.PoolDataSource").setLevel(Level.FINEST);

サポートされるログ・レベル

次に、JDBCでサポートされる各ログ・レベルを示します。FINEよりも低いレベルでは、ユーザーにとって重要とはかぎらない出力が生成されます。FINERよりも低いレベルでは、非常に大量の出力が生成されます。

- INTERNAL_ERROR: 内部エラー

- SEVERE: SQL例外

- WARNING: SQL警告およびその他の隠れた問題

- INFO: パブリック・イベント(接続の試行やOracle RACイベントなど)

- CONFIG: SQL文

- FINE: パブリックAPI

- TRACE_10: 内部イベント

- FINER: 内部API

- TRACE_20: 内部デバッグ

- TRACE_30: 大量の内部API

- FINEST: 大量の内部デバッグ

例外およびエラー・コード

多くのUCPメソッドは、例外チェーンがサポートされたUniversalConnectionPoolExceptionをスローします。スローした例外で、printStackTraceメソッドをコールすると、例外の根本原因を特定できます。UniversalConnectionPoolExceptionには、45000から45499までの範囲の標準のOracleエラー・コードが含まれています。getErrorCodeメソッドを使用すると、例外のエラー・コードを取得できます。

A エラー・コード・リファレンス

この付録では、ユニバーサル接続プール(UCP)のエラー・メッセージ、接続プール・レイヤー用のUCPエラー・メッセージおよびJDBCデータソースと動的プロキシ用のUCPエラー・メッセージの一般構造について簡単に説明します。この付録の構成は次のとおりです。

- UCPエラー・メッセージの一般構造

- 接続プール・レイヤーのエラー・メッセージ

- JDBCデータソースおよび動的プロキシのエラー・メッセージ

2つのメッセージ・リストはエラー・メッセージ番号順にソートされています。

UCPエラー・メッセージの一般構造

UCPエラー・メッセージの一般構造は、次のようにメッセージの末尾にコロンを付けて、実行時情報を追加できます。

<error_message>:<extra_info>

たとえば、closed statementエラーは次のように表示されることがあります。

Closed Statement:next

これは(結果セット・オブジェクトの)nextメソッドのコール中に例外がスローされたことを示します。

場合によっては、スタック・トレースに同様の情報が見つかることがあります。

接続プール・レイヤーのエラー・メッセージ

この項では、接続プール・レイヤーのUCPエラー・メッセージを示します。

表A-1 接続プール・レイヤーのエラー・メッセージ

エラー・メッセージ番号

メッセージ

UCP-45001

ユニバーサル接続プールの内部エラー

UCP-45002

ユニバーサル接続プールに使用可能な接続がありません

UCP-45003

ユニバーサル接続プールがすでに存在します

UCP-45004

接続取得情報が無効です

UCP-45005

コールバックはすでに登録されています

UCP-45006

ユニバーサル接続プールの構成が無効です

UCP-45051

非アクティブ接続タイムアウトのタイマーのスケジュールに失敗しました

UCP-45052

中止接続タイムアウトのタイマーのスケジュールに失敗しました

UCP-45053

TTL接続タイムアウトのタイマーのスケジュールに失敗しました

UCP-45054

ユニバーサル接続プールはNULLにできません

UCP-45055

使用可能な接続の削除中にエラーが発生しました

UCP-45057

AvailableConnectionsオブジェクトはNULLにできません

UCP-45058

FailoverableオブジェクトはNULLにできません

UCP-45059

MaxPoolsizeは、0(ゼロ)に設定されます。返す接続がありません

UCP-45060

ライフサイクルの状態が無効です。ユニバーサル接続プールの状態を確認してください

UCP-45061

ユニバーサル接続プールが起動していません。ユニバーサル接続プールを起動してからアクセスしてください

UCP-45062

使用可能な接続の収集は、ユニバーサル接続プールが初期化状態の場合にのみ設定可能です

UCP-45063

接続の取得試行中にユニバーサル接続プールが停止しました

UCP-45064

ユニバーサル接続プールのすべての接続が使用中です

UCP-45065

接続流用がNULLを返しました

UCP-45091

接続ラベリング・コールバックはすでに登録されています

UCP-45092

ラベリング・コールバックが登録されていないラベル付き接続を流用しています

UCP-45093

ラベルなし接続をリクエストしましたが、ラベル付き接続を流用しています

UCP-45097

接続獲得タイマーのスケジュールに失敗しました

UCP-45100

ConnectionFactoryAdapterがNULLを返しました

UCP-45103

ConnectionFactoryAdapterはDataSourceConnectionFactoryAdapterのインスタンスである必要があります

UCP-45104

ConnectionFactoryAdapterオブジェクトはNULLにできません

UCP-45105

ConnectionFactoryAdapterはConnectionPoolDataSourceConnectionFactoryAdapterのインスタンスである必要があります

UCP-45106

ConnectionFactoryAdapterはXADataSourceConnectionFactoryAdapterのインスタンスである必要があります

UCP-45150

UniversalPooledConnectionはNULLにできません

UCP-45152

UniversalPooledConnectionStatusオブジェクトはNULLにできません

UCP-45153

接続ラベル・キーはNULLまたは空の文字列にできません

UCP-45154

接続ラベリング操作はクローズされた接続では起動できません

UCP-45155

接続獲得コールバックはすでに登録されています

UCP-45156

中止接続タイムアウト・コールバックはすでに登録されています

UCP-45157

TTL接続タイムアウト・コールバックはすでに登録されています

UCP-45201

接続ラベル・キーはNULLまたは空の文字列にできません

UCP-45202

ConnectionRetrievalInfoオブジェクトのクローニングに失敗しました

UCP-45203

接続リクエスト情報がNULLです

UCP-45251

ConnectionPoolDataSourceはNULLにできません

UCP-45252

ConnectionRetrievalInfoオブジェクトが無効です

UCP-45253

ConnectionPoolDataSourceからのPooledConnectionの取得中にSQLExceptionが発生しました

UCP-45254

接続タイプが無効です。javax.sql.PooledConnectionである必要があります

UCP-45255

PooledConnectionのクローズ中にSQLExceptionが発生しました

UCP-45256

データ・ソースはNULLにできません

UCP-45257

データ・ソースから接続を取得できません

UCP-45258

接続タイプが無効です。java.sql.Connectionである必要があります

UCP-45259

プロキシへの接続はjava.sql.Connectionのインスタンスである必要があります

UCP-45260

XADatasourceはNULLにできません

UCP-45261

XADataSourceからのXAConnectionの取得中にSQLExceptionが発生しました

UCP-45262

接続タイプが無効です。javax.sql.XAConnectionである必要があります

UCP-45263

XAConnectionのクローズ中にSQLExceptionが発生しました

UCP-45264

接続はNULLにできません

UCP-45265

プロキシへの接続はjava.sql.Statementのインスタンスである必要があります

UCP-45266

プロキシへの文はjava.sql.ResultSetのインスタンスである必要があります

UCP-45267

プロキシへの接続はjavax.sql.XAConnectionのインスタンスである必要があります

UCP-45268

Driver引数はnullにできません

UCP-45269

URL引数はnullにできません

UCP-45301

フェイルオーバー情報への接続を取得できません

UCP-45302

フェイルオーバー情報を取得するSQL問合せを実行できません

UCP-45303

フェイルオーバー情報の取得中にSQLExceptionが発生しました

UCP-45304

イベント・タイプはNULLにできません

UCP-45305

イベント・タイプが無効です。イベント・タイプはdatabase/event/hostまたはdatabase/event/serviceである必要があります

UCP-45306

フェイルオーバー・イベント・タイプが無効です。OracleFailoverEventである必要があります

UCP-45307

アフィニティ・コンテキストが無効です。OracleConnectionAffinityContextである必要があります

UCP-45308

リモートONSサブスクリプションのフェイルオーバーの有効化中に例外が発生しました

UCP-45350

ユニバーサル接続プールはユニバーサル接続プール・マネージャにすでに存在しています。ユニバーサル接続プールをユニバーサル接続プール・マネージャに追加できません

UCP-45351

ユニバーサル接続プール・マネージャにユニバーサル接続プールが見つかりません。ユニバーサル接続プール・マネージャにユニバーサル接続プールを登録してください

UCP-45352

ユニバーサル接続プール・マネージャのインスタンスを取得できません

UCP-45353

ユニバーサル接続プール・マネージャのMBeanインスタンスを取得できません

UCP-45354

MBean ObjectNameの形式が正しくありません。正しい形式を使用してMBeanのObjectNameを構成してください

UCP-45355

MBeanの登録または登録解除中にMBean例外が発生しました

UCP-45356

MBeanはMBeanServerにすでに存在しています。別の名前を使用してMBeanを登録してください

UCP-45357

JMXに準拠していないMBeanオブジェクトのMBean Serverへの登録中に例外が発生しました

UCP-45358

指定されたMBeanはリポジトリに存在しません

UCP-45359

無効なターゲット・オブジェクト・タイプが指定されています。管理リソースを確認してください

UCP-45360

無効なMBean記述子が指定されています。ユニバーサル接続プール・マネージャのMBean記述子を確認してください

UCP-45361

ユニバーサル接続プール・マネージャのMBeanのMBeanInfoの作成中にランタイム例外が発生しました

UCP-45362

ユニバーサル接続プール・マネージャのMBeanのコンストラクタ情報の作成中にランタイム例外が発生しました

UCP-45363

ユニバーサル接続プール・マネージャのMBeanの属性情報の作成中にランタイム例外が発生しました

UCP-45364

ユニバーサル接続プール・マネージャのMBeanの操作情報の作成中にランタイム例外が発生しました

UCP-45365

ユニバーサル接続プールはConnectionConnectionPoolまたはOracleConnectionConnectionPoolのインスタンスである必要があります

UCP-45366

無効なMBean記述子が指定されています。JDBCユニバーサル接続プールのMBean記述子を確認してください

UCP-45367

JDBCユニバーサル接続プールのMBeanのMBeanInfoの作成中にランタイム例外が発生しました

UCP-45368

JDBCユニバーサル接続プールのMBeanのコンストラクタ情報の作成中にランタイム例外が発生しました

UCP-45369

JDBCユニバーサル接続プールのMBeanの属性情報の作成中にランタイム例外が発生しました

UCP-45370

JDBCユニバーサル接続プールのMBeanの操作情報の作成中にランタイム例外が発生しました

UCP-45371

ユニバーサル接続プールのMBeanの属性情報の作成中にランタイム例外が発生しました

UCP-45372

ユニバーサル接続プールのMBeanの操作情報の作成中にランタイム例外が発生しました

UCP-45373

無効なMBean記述子が指定されています。ユニバーサル接続プールのMBean記述子を確認してください

UCP-45374

ユニバーサル接続プールのMBeanのMBeanInfoの作成中にランタイム例外が発生しました

UCP-45375

UCPメトリック収集を停止できません。メトリック収集の停止中か、ナウンまたはセンサーの破棄中に例外が発生しました。

UCP-45376

メトリック更新タイマー・タスクのスケジュールに失敗しました

UCP-45377

UCPメトリック・センサーの更新中に問題が発生しました

UCP-45378

ユニバーサル接続プールがOracleJDBCConnectionPoolのインスタンスではないため、ONSConfigurationプロパティにアクセスできません

UCP-45379

ユニバーサル接続プールのMBeanで接続プール名を設定できません。重複しないように接続プール名を確認してください

UCP-45380

MBeanオブジェクトがNULLです

UCP-45381

MBeanオブジェクト名がNULLです

UCP-45382

MBean表示名がNULLです

UCP-45383

ユニバーサル接続プール・マネージャでプール作成用のアダプタが無効です

UCP-45384

ユニバーサル接続プール・マネージャのMBeanでプール作成用のアダプタが無効です

UCP-45385

ユニバーサル接続プール・マネージャでプールを作成中にエラーが発生しました

UCP-45386

ユニバーサル接続プール・マネージャのMBeanでプールを作成中にエラーが発生しました

UCP-45401

待機スレッドのLO水位標は負にできません

UCP-45402

待機スレッドのHI水位標は負にできません

UCP-45403

ワーカー・スレッド合計の上限は負にできません

UCP-45404

キューのポーリング・タイムアウトは負にできません

UCP-45405

待機スレッドのHI水位標はLO水位標より低くできません

UCP-45406

ワーカー・スレッド合計の上限は待機スレッドの上限よりも大きくできません

UCP-45407

エラー番号が範囲外です

UCP-45408

ログ出力がNULLであるため、操作は無効です

JDBCデータソースおよび動的プロキシのエラー・メッセージ

この項では、JDBCデータソースのUCPエラー・メッセージおよび動的プロキシのエラー・メッセージを示します。

表A-2 JDBCデータソースおよび動的プロキシのエラー・メッセージ

エラー・メッセージ番号

メッセージ

SQL-0

ユニバーサル接続プールを起動できません

SQL-1

ユニバーサル接続プールを作成できません

SQL-2

最小プール・サイズが無効です

SQL-3

最大プール・サイズが無効です

SQL-4

非アクティブ接続タイムアウトが無効です

SQL-5

接続待機タイムアウトが無効です

SQL-6

TTL接続タイムアウトが無効です

SQL-7

中止接続タイムアウトが無効です

SQL-8

タイムアウト・チェック間隔が無効です

SQL-9

フェイルオーバーの有効化に失敗しました

SQL-10

maxStatements値の設定に失敗しました

SQL-11

検証用のSQL文字列の設定に失敗しました

SQL-12

接続獲得トリガー数が無効です

SQL-13

接続獲得最大数が無効です

SQL-14

ユニバーサル接続プールはすでに作成されています。ユニバーサル接続プールは再作成できません

SQL-15

ユニバーサル接続プールの破棄中に例外が発生しました

SQL-16

操作はOracleの接続プールにのみ適用されます

SQL-17

ONS構成文字列の設定中に例外が発生しました

SQL-18

ラベリング・コールバックの登録に失敗しました

SQL-19

ラベリング・コールバックの削除に失敗しました

SQL-20

アフィニティ・コールバックの登録に失敗しました

SQL-21

アフィニティ・コールバックの削除に失敗しました

SQL-22

ユニバーサル接続プールの構成が無効です

SQL-23

指定されたファクトリ・クラス名を持つファクトリ・クラス・インスタンスの作成に失敗しました

SQL-24

ユーザーの設定に失敗しました

SQL-25

パスワードの設定に失敗しました

SQL-26

URLの設定に失敗しました

SQL-27

ファクトリ・クラスはデータソースのインスタンスである必要があります

SQL-28

接続を作成できません。使用可能な接続がありません

SQL-29

接続の取得中に例外が発生しました

SQL-30

ユニバーサル接続プールが起動されていません

SQL-31

接続はクローズされています

SQL-32

ラベルの適用中にエラーが発生しましたラ

SQL-33

接続ラベルの削除中にエラーが発生しました

SQL-34

ラベルの取得中にエラーが発生しました

SQL-35

不一致ラベルの取得中にエラーが発生しました

SQL-36

獲得可能な接続の設定中にエラーが発生しました

SQL-37

獲得中のコールバックの登録中にエラーが発生しました

SQL-38

獲得中のコールバックの削除中にエラーが発生しました

SQL-39

中止接続コールバックの登録中にエラーが発生しました

SQL-40

中止接続コールバックの削除中にエラーが発生しました

SQL-41

TTL接続コールバックの登録中にエラーが発生しました

SQL-42

TTL接続コールバックの削除中にエラーが発生しました

SQL-43

結果セットはクローズされています

SQL-44

文はクローズされています

SQL-45

接続プール名を設定できません。重複しないように接続プール名を確認してください

SQL-46

SQL文字列がNULLです

SQL-47

接続の無効化設定中にエラーが発生しました

SQL-48

接続プロパティを設定できません

SQL-49

データベース・サーバー名を設定できません

SQL-50

データベース・ポート番号を設定できません

SQL-51

データベース名を設定できません

SQL-52

データ・ソース名を設定できません

SQL-53

データ・ソースの説明を設定できません

SQL-54

データ・ソース・ネットワーク・プロトコルを設定できません

SQL-55

データ・ソース・ロール名を設定できません

SQL-56

最大接続再使用時間が無効です

SQL-57

最大接続再使用数が無効です

SQL-58

メソッドは無効化されています

SQL-59

接続ファクトリのプロパティを設定できません

索引
A  B  C  D  E  F  G  H  I  J  L  M  O  P  R  S  T  U  V  W  X

A

中止接続タイムアウト・プロパティ, 4.3.2

AbandonedConnectionTimeoutCallback, 6.1

adminパッケージ, 2.4

アフィニティ

トランザクションベース, 8.4.1

webセッション, 8.4.1

APIの概要, 2.4 アプリケーション・コンティニュイティ

接続初期化コールバック, 9.3

接続ラベリング, 9.2

データソースの構成, 9.1

アプリケーション・コンティニュイティ, 9 applyConnectionLabel, 5.4 接続ラベルの適用, 5.4

B

基本的な接続の例, 2.3

接続プールの利点, 1.1.1

FCFの利点, 8.2.1

実行時接続ロード・バランシングの利点, 8.3.1

接続の流用

基本的な手順, 2.2

概念アーキテクチャ, 1.2.1

ラベル付けされた, 5.5

概要, 3.1

JNDIの使用方法, 3.1.4

プール対応のデータソースの使用方法, 3.1.1

プール対応のXAデータソースの使用方法, 3.1.2

C

文のキャッシング, 4.5

コールバック

接続アフィニティ, 8.4.2.1

ラベル付け, 5.2

不一致ラベルのチェック, 5.6 接続のクローズ, 3.4 概念アーキテクチャ, 1.2.1 configureメソッド, 5.2.1, 5.2.1 ONSの構成, 8.2.6

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

allowgroupパラメータ, 8.2.6.3

リモート構成, 8.2.6.2 接続アフィニティ

コールバックの作成, 8.4.2.1

概要, 8.4.1

コールバックの登録, 8.4.2.2

コールバックの削除, 8.4.2.3

設定, 8.4.2

統計情報, 10.3.3

トランザクションベース, 8.4.1

webセッション, 8.4.1

コネクション・ファクトリ, 2.2

概念アーキテクチャ, 1.2.1

要件, 2.1

設定, 3.1.1, 3.1.2

接続ラベル

適用, 5.4

不一致のチェック, 5.6

コールバックの実装, 5.2

概要, 5.1

削除, 5.7

Connectionオブジェクト, 1.2.1 接続プール

利点, 1.1.1

明示的に作成, 7.1.3.1

暗黙的に作成, 2.2, 3.1

破棄, 7.1.3.4

概要, 1.1

メンテナンス, 7.1.4

パージ, 7.1.4.3

リサイクル, 7.1.4.2

リフレッシュ, 7.1.4.1

接続の削除, 3.5

起動, 7.1.3.2

停止, 7.1.3.3

ライフサイクルの概要, 7.1.3

接続プール・マネージャ

作成, 7.1.2

明示的なプールの作成, 7.1.3.1

プールの破棄, 7.1.3.4

概要, 1.2.3, 7.1.1

プールのパージ, 7.1.4.3

プールのリサイクル, 7.1.4.2

プールのリフレッシュ, 7.1.4.1

プールの起動, 7.1.3.2

プールの停止, 7.1.3.3

接続プールのプロパティ

中止接続タイムアウト, 4.3.2

接続待機タイムアウト, 4.3.4

獲得最大数, 4.4.3

獲得トリガー数, 4.4.2

非アクティブ接続タイムアウト, 4.3.5

初期プール・サイズ, 4.2.1

最大接続再使用数, 4.3.1.2

最大接続再使用時間, 4.3.1.1

最大プール・サイズ, 4.2.3

最大文数, 4.5.1

最小プール・サイズ, 4.2.2

最適化, 4.1

概要, 1.2.2

設定, 3.2, 4.1

タイムアウト・チェック間隔, 4.3.6

TTL接続タイムアウト, 4.3.3

流用時の検証, 3.3.1

接続プロパティ, 3.1.3 接続再使用プロパティ, 設定, 4.3.1 接続の手順, 基本, 2.2

例, 2.3

接続URL, 8.2.7 接続待機タイムアウト・プロパティ, 4.3.4 ConnectionAffinityCallbackインタフェース, 8.4.2.1 ConnectionLabelingCallbackインタフェース, 5.1, 5.2.1 接続

基本的な手順, 2.2

流用, 3.1

ラベル付けされた接続の流用, 5.5

JNDIを使用した流用, 3.1.4

有効性のチェック, 3.3.2

クローズ, 3.4

失効の制御, 4.3

獲得, 4.4

ラベル付け, 5.1

プールからの削除, 3.5

実行時ロード・バランシング, 8.3.1

アフィニティの使用方法, 8.4.1

流用時の検証, 3.3.1

costメソッド, 5.2.1, 5.2.1 接続プールの作成

明示的, 7.1.3.1

暗黙的, 2.2

D

データソース

PoolDataSource, 1.2.1, 3.1.1

PoolXADataSource, 1.2.1, 3.1.2

データベース要件, 2.1 DBMS_SERVICE.SERVICE_TIME, 8.3.2 DBMS_SERVICE.THROUGHPUT, 8.3.2 destroyConnectionPool, 7.1.3.4 接続プールの破棄, 7.1.3.4

E

FCFプロパティの有効化, 8.2.5

エラー

接続プール・レイヤーのメッセージ, A.2

UCPメッセージの一般構造, A.1

JDBCデータソースおよび動的プロキシのメッセージ, A.3

例

基本的な接続, 2.3

接続アフィニティ・コールバック, 8.4.2.1

FCF, 8.2.4

ラベリング・コールバック, 5.2.1.1

F

FAN, 8.2.1

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

前提条件, 8.2.3

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

「FCF」を参照

FCF, 8.2.1

接続URLの構成, 8.2.7

ONSの構成, 8.2.6

有効化, 8.2.5

例, 8.2.4

統計情報, 10.3.1

G

GDS, 8.5

getAffinityPolicy, 8.4.2.1

getConnectionメソッド, 3.1.1, 5.5

getPoolDataSource, 3.1.1

getPoolXADataSource, 3.1.2

getStatistics, 10.3

接続の取得, 3.1.1

XA接続の取得, 3.1.2

getUniversalConnectionPoolManager, 7.1.2

getUnmatchedConnectionLabels, 5.6

getXAConnectionメソッド, 3.1.2

グローバル・データ・サービス, 8.5

H

接続の獲得, 4.4

獲得最大数プロパティ, 4.4.3

獲得トリガー数プロパティ, 4.4.2

HarvestableConnectionインタフェース, 4.4.1

高可用性, 1.2.4, 8.1

I

非アクティブ接続タイムアウト・プロパティ, 4.3.5

初期プール・サイズのプロパティ, 4.2.1

統合

サード・パーティ, 3.6

isValid, 3.3.2

J

JDBC接続プール

「UCP for JDBC」を参照

JDBCドライバ

接続プロパティ, 3.1.3

要件, 2.1

jdbcパッケージ, 2.4 JNDI, 3.1.4 JRE要件, 2.1

L

LabelableConnectionインタフェース, 5.1, 5.4

ラベル付けされた接続

ラベルの適用, 5.4

流用, 5.5

不一致のチェック, 5.6

コールバックの実装, 5.2

概要, 5.1

ラベルの削除, 5.7

ラベリング・コールバック

作成, 5.2.1

例, 5.2.1.1

登録, 5.2.2

削除, 5.2.3

実行時アルゴリズム, 5.2.1

接続プールのライフサイクル, 7.1.3 ライフサイクルの状態, 7.1.3 ロード・バランシング・アドバイザ, 8.3.1 ロード・バランシング, 8.2.7, 8.3.1 ロギング, 10.4 ロギングの構成

プログラム的, 10.4.2

プロパティ・ファイル, 10.4.1

ロギング・レベル, 10.4.3

M

マネージャ, 接続プール, 7.1.1

最大接続再使用数プロパティ, 4.3.1.2

最大接続再使用時間プロパティ, 4.3.1.1

最大プール・サイズのプロパティ, 4.2.3

最大文数プロパティ, 4.5.1

メソッド, 3.1.2

最小プール・サイズのプロパティ, 4.2.2

O

ONS, 8.2.6

ons.configファイル, 8.2.6, 8.2.6.1, 8.2.6.1

接続プールの最適化, 4.1

Oracle Clientソフトウェア, 8.2.6

Oracle Clientソフトウェア要件, 2.1

Oracle Notification Service

「ONS」を参照

Oracle RAC

接続アフィニティ, 8.4.1

FCF, 8.2.1

機能の概要, 8.1

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

統計情報, 10.3

Oracle RACロード・バランシング・アドバイザ, 8.3.1 概要

API, 2.4

接続プール・マネージャ, 7.1.1

接続プールのプロパティ, 4.1

接続プール, 全般, 1.1

接続の手順, 2.2

高可用性およびパフォーマンス機能, 1.2.4

接続のラベル付け, 5.1

Oracle RAC機能, 8.1

UCP for JDBC, 1.2

P

パスワード, 2.2, 3.1.1, 3.1.2

プール・マネージャ

「接続プール・マネージャ」を参照

プールのプロパティ

「接続プールのプロパティ」を参照

プール・サイズ, 制御

初期サイズ, 4.2.1

最大, 4.2.3

最小, 4.2.2

PoolDataSourceインタフェース, 1.2.1, 3.1.1 PoolDataSourceFactoryクラス, 3.1.1, 3.1.2 PoolDataSourceImpl, 3.6 プール対応のデータソース

インスタンスの作成, 3.1.1

プール対応のXAデータソース

インスタンスの作成, 3.1.2

PoolXADataSourceインタフェース, 1.2.1, 3.1.2 PoolXADataSourceImpl, 3.6 purgeConnectionPool, 7.1.4.3 接続プールのパージ, 7.1.4.3

R

Real Application Clusters

「Oracle RAC」を参照

recycleConnectionPool, 7.1.4.2 接続プールのリサイクル, 7.1.4.2 refreshConnectionPool, 7.1.4.1 接続プールのリフレッシュ, 7.1.4.1 registerConnectionAffinityCallback, 8.4.2.2 registerConnectionLabelingCallback, 5.2.2 removeConnectionAffinityCallback, 8.4.2.3 removeConnectionLabel, 5.7 removeConnectionLabelingCallback, 5.2.3 接続ラベルの削除, 5.7 プールからの接続の削除, 3.5 再利用プロパティ

最大数, 4.3.1.2

再利用プロパティ

最大時間, 4.3.1.1

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

概要, 8.3.1

設定, 8.3.2

統計情報, 10.3.2

S

SERVICE_TIME, 8.3.2

setAbandonConnectionTimeout, 4.3.2

setAffinityPolicy, 8.4.2.1

setConnectionAffinityContext, 8.4.2.1

setConnectionFactoryClassName, 3.1.1, 3.1.2

setConnectionHarvestable, 4.4.1

setConnectionHarvestMaxCount, 4.4.3

setConnectionHarvestTriggerCount, 4.4.2

setConnectionProperties, 3.1.3

setConnectionWaitTimeout, 4.3.4

setFastConnectionFailoverEnabled, 8.2.5

setInactiveConnectionTimeout, 4.3.5

setInitialPoolSize, 4.2.1

setInvalid, 3.3.2, 3.5

setMaxConnectionReuseCount, 4.3.1.2

setMaxConnectionReuseTime, 4.3.1.1

setMaxPoolSize, 4.2.3

setMaxStatements, 4.5.1

setMinPoolSize, 4.2.2

setONSConfiguration, 8.2.6

setPassword, 3.1.1, 3.1.2

setSQLForValidateConnection, 3.3.1

setTimeToLiveConnectionTimeout, 4.3.3

setTimoutCheckInterval, 4.3.6

setURL, 3.1.1, 3.1.2

setUser, 3.1.1, 3.1.2

setValidateConnectionOnBorrow, 3.3.1

SHORT, 8.3.2

SQL文キャッシング, 4.5

失効した接続, 4.3

startConnectionPool, 7.1.3.2

接続プールの起動, 7.1.3.2

文キャッシング, 4.5

統計情報

接続アフィニティ, 10.3.3

FCF, 10.3.1

Oracle RAC, 10.3

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

stopConnectionPool, 7.1.3.3 接続プールの停止, 7.1.3.3

T

サード・パーティの統合, 3.6

THROUGHPUT, 8.3.2

タイムアウト・チェック間隔プロパティ, 4.3.6

タイムアウト・プロパティ

中止, 4.3.2

チェック間隔, 4.3.6

非アクティブ, 4.3.5

TTL, 4.3.3

待機, 4.3.4

TTL接続タイムアウト・プロパティ, 4.3.3 TimeToLiveConnectionTimeoutCallback, 6.2 トランザクションベースのアフィニティ, 8.4.1

U

UCP for JDBC

APIの概要, 2.4

基本的な接続の手順, 2.2

概念アーキテクチャ, 1.2.1

接続プール・マネージャ

接続プールのプロパティ, 3.2, 4.1

Oracle RAC機能, 8.1

概要, 1.2

ソフトウェア要件, 2.1

UCPマネージャ

「接続プール・マネージャ」を参照

ucpパッケージ, 2.4 ユニバーサル接続プール

「UCP for JDBC」を参照

UniversalConnectionPoolManagerインタフェース, 7.1.2 UniversalConnectionPoolManagerImpl, 7.1.2 不一致ラベル, 5.6 URL, 2.2, 3.1.1, 3.1.2, 8.2.7 ユーザー名, 2.2, 3.1.1, 3.1.2

V

接続の検証

流用時, 3.3.1

プログラム的, 3.3.2

ValidConnectionインタフェース, 3.3.2, 3.5

W

webセッション・アフィニティ, 8.4.1

X

XA接続, 1.2.1, 3.1.2

XAConnectionオブジェクト, 1.2.1

オラクル社の法律上の注意点について

コピーライトについて

Copyright © 1994-2014, Oracle and/or its affiliates.All rights reserved.

商標と登録商標について

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

ライセンス制約の保証と結果的に生じる損害の免責

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

保証免責

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

制限付権利

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

危険な用途への使用について

このソフトウェアもしくはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション（人的傷害を発生させる可能性があるアプリケーションを含む）への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性（redundancy）、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

第三者のコンテンツ、製品、サービスに対する免責事項

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

ドラフトのアルファ版およびベータ版ドキュメントについて

このドキュメントが試作版の場合:

このドキュメントは試作版であり、デモおよび暫定使用のみを目的としたものです。このソフトウェアを使用するハードウェアに限定するものではありません。オラクル社およびその関連会社は、このドキュメントに関して一切の責任を負わず、いかなる保証もいたしません。また、このドキュメントを使用したことによって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。