この章の内容は次のとおりです。
UCP for JDBCには、次の設計時および実行時の要件があります。
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 for JDBCには、UCP JDBC接続プールから接続を流用するためにアプリケーションで使用されるプール対応のデータソースが用意されています。最も基本的な使用例では、接続プールは明示的に定義されません。かわりに、接続が流用される際に、デフォルトの接続プールが暗黙的に作成されます。
次の手順では、データベースにアクセスするために、UCP for JDBCプール対応のデータソースから接続を取得する方法について説明します。例の詳細は、例2-1「基本的な接続の例」を参照してください。
UCP for JDBCのデータソース・ファクトリ(oracle.ucp.jdbc.PoolDataSourceFactory
)を使用し、getPoolDataSource
メソッドを使用してプール対応のデータソースのインスタンスを取得します。データソース・インスタンスの型はPoolDataSource
である必要があります。次に例を示します。
PoolDataSource pds = PoolDataSourceFactory.getPoolDataSource();
データベースへの物理的な接続の取得に必要な接続プロパティを設定します。これらのプロパティはデータソース・インスタンスに設定され、データベースに接続するためのURL、ユーザー名およびパスワード、物理的な接続の取得に使用されるコネクション・ファクトリなどがあります。これらは、JDBCドライバおよびデータベースに固有のプロパティです。次に例を示します。
pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource"); pds.setURL("jdbc:oracle:thin:@//localhost:1521/XE"); pds.setUser("<user>"); pds.setPassword("<password>");
接続プールのデフォルトの動作を上書きするために、プール・プロパティを設定します。プール・プロパティはデータソース・インスタンスに設定されます。次に例を示します。
pds.setInitialPoolSize(5);
データソース・インスタンスを使用して接続を取得します。戻される接続は、データソースの接続プール内にある物理的な接続への論理的なハンドルです。次に例を示します。
Connection conn = pds.getConnection();
接続を使用して、データベースで処理を実行します。
Statement stmt = conn.createStatement (); stmt.execute("SELECT * FROM foo");
接続をクローズし、プールに返します。
conn.close();
次の例では、データベースに接続して処理を実行し、終了するプログラムを示します。この例は単純で、場合によってはあまり実用的ではありません。しかし、データベースにアクセスするために、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のパッケージの概略を示します。APIの詳細は、『Oracle Universal Connection Pool Java API Reference』を参照してください。
oracle.ucp.jdbc
このパッケージには、JDBC接続および接続プールを使用して処理を実行するためにアプリケーションで使用される様々なインタフェースおよびクラスが含まれます。このパッケージに含まれるインタフェースの中でPoolDataSource
およびPoolXADataSource
データソース・インタフェースが、接続の取得と接続プールのプロパティの取得および設定のために使用されます。これら2つのインタフェースを実装するデータソース・インスタンスは、接続プールを自動的に作成します。
oracle.ucp.admin
このパッケージには、接続プール・マネージャを使用するためのインタフェースが含まれます。また、ユーザーがJMX操作を使用し、接続プールと接続プール・マネージャの操作および属性にアクセスできるようにするMbeanを使用するためのインタフェースも含まれます。インタフェースの中でも、UniversalConnectionPoolManager
インタフェースが、接続プール・インスタンスを作成およびメンテナンスするためのメソッドを提供します。
このパッケージには、接続プール機能の実装に使用される必須および任意のコールバック・インタフェースが含まれます。たとえば、ConnectionAffinityCallback
インタフェースは、接続アフィニティを有効または無効にするコールバックの作成に使用されますが、接続アフィニティの動作のカスタマイズにも使用できます。別の例をあげると、中止接続機能は、流用された接続が一定の期間非アクティブであると、その接続をプールに返します。AbandonedConnectionTimeoutCallback
インタフェースは、中止タイムアウトが発生した後に接続をプールに返す必要があるかどうかをカスタマイズするために使用できます。また、プールに返される前に接続が処理されるようにするためにも使用できます。
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
ロギングは、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
: 大量の内部デバッグ