一般に中間層で実装される接続キャッシュは、物理データベース接続のキャッシュを維持し、使用するための手段です。
注意: Oracle Database 11gリリース2 (11.2)から、この機能は非推奨となり、Universal Connection Pool (UCP) for JDBCがこれに置き換わりました。新しいアーキテクチャは、以前より強力でパフォーマンスも向上しているため、こちらを使用することをお薦めします。詳細は、次のリンクを参照してください。
|
暗黙的接続キャッシュは、Java Database Connectivity(JDBC)3.0に準拠した、DataSource
用の接続キャッシュの実装です。キャッシュへの透過的アクセス、複数ユーザーのサポート、およびユーザー定義のプロファイルに基づいて接続を要求できる機能は、JavaおよびJava2 Platform, Enterprise Edition(J2EE)アプリケーションに対して役立ちます。
アプリケーションは、OracleDataSource
でsetConnectionCachingEnabled(true)
をコールすることにより、暗黙的接続キャッシュを有効にします。暗黙的キャッシュを有効にすると、OracleDataSource
への最初の接続要求により、透過的に接続キャッシュが作成されます。アプリケーション開発者がキャッシュ実装を作成する必要はありません。
この章の内容は次のとおりです。
注意: 接続キャッシュの概念は、デフォルト接続を常に使用するサーバー側内部ドライバには関係しません。接続キャッシュは、クライアント側JDBCドライバとサーバー側Thinドライバにのみ関係します。 |
キャッシュがデータソースのアーキテクチャに透過的に統合されるよう、接続キャッシュ・アーキテクチャは再設計されました。
接続キャッシュは、物理接続と論理接続の概念を使用します。物理接続は、データベースによって戻される実際の接続で、論理接続は、物理接続を操作するためにキャッシュが使用するコンテナです。論理接続は、ハンドルとみなすこともできます。キャッシュは、物理接続と同じインタフェースを実装する論理接続を常に戻します。
暗黙的接続キャッシュは、次のものを提供します。
ドライバからの独立性
JDBC ThinドライバおよびJDBC Oracle Call Interface(OCI)ドライバは、いずれも暗黙的接続キャッシュをサポートします。
JDBC接続キャッシュへの透過的アクセス
アプリケーションが暗黙的キャッシュを有効にすると、接続の取得に標準OracleDataSource
Application Program Interface(API)が使用されます。キャッシュを有効にすると、すべての接続要求が、接続キャッシュから処理されます。
論理接続をクローズするためにアプリケーションがOracleConnection.close
メソッドをコールすると、物理接続がキャッシュに戻されます。
OracleDataSource
インスタンスごとに1つのキャッシュ
接続キャッシュが有効になると、各キャッシュ対応のOracleDataSource
ごとに1つずつキャッシュが関連付けられます。そのデータソースを通じて取得された接続は、使用されたユーザー名とパスワードに関係なく、すべてキャッシュに戻されます。アプリケーションがデータソースからの接続を要求すると、キャッシュは既存の接続を戻すか、または一致する認証情報を使用した新しい接続を作成します。
注意: キャッシュは、DataSource インスタンス間で共有されません。キャッシュ対応のDataSource インスタンスとキャッシュの間には、1対1のマッピングが確立されます。 |
1つのキャッシュでの異なるユーザー名とパスワードの使用
以前のキャッシュ実装と異なり、同じデータソースから取得されたすべての接続が、共通のキャッシュに格納されます。接続が要求したユーザー名とパスワードには関係がありません。
複数ユーザーのサポートおよび必須のキャッシュ・プロパティのサポートを含めた、JDBC 3.0接続キャッシュのサポート。
プロパティに基づいた構成
キャッシュのプロパティは、キャッシュの動作を定義します。サポートされているプロパティは、タイムアウト、キャッシュが保持する接続数などを設定します。これらのプロパティを使用することにより、アプリケーションは放棄された接続を再生および再利用できます。暗黙的接続キャッシュは、すべてのJDBC 3.0接続キャッシュ・プロパティをサポートします。
OracleConnectionCacheManager
新規OracleConnectionCacheManager
クラスは、接続キャッシュの管理にアプリケーションが使用できる豊富な管理APIを提供しています。仮想マシンごとに、OracleConnectionCacheManager
の別個の1つのインスタンスが存在します。アプリケーションは、単一のOracleConnectionCacheManager
インスタンスによってキャッシュを管理します。
ユーザー定義の接続属性
暗黙的接続キャッシュは、どの接続がキャッシュから取得されるかを決定するために使用できる、ユーザー定義の接続属性をサポートします。接続属性は、キャッシュ・メカニズムによってでなく、アプリケーションによってセマンティクスが定義されるラベルとみなすことができます。
コールバック・メカニズム
暗黙的接続キャッシュは、キャッシュへの接続の戻り時、放棄された接続の処理時、および接続が要求されたがキャッシュに存在しない場合のキャッシュの動作を、ユーザーが定義できるメカニズムを提供しています。
接続時ロード・バランシング
暗黙的接続キャッシュは、アプリケーションによって接続が最初に作成された時点で、接続時ロード・バランシングを提供します。データベース・リスナーは、接続の作成時点でこの処理を実行するのに最適なOracle Real Application Clustersの複数のインスタンスに接続作成を配布します。
関連項目: 『Oracle Real Application Clusters管理およびデプロイメント・ガイド』 |
実行時接続ロード・バランシング
作業要求の実行時接続ロード・バランシングでは、サービス・メトリックを使用して、最大のパフォーマンスを提供するOracle Real Application Clustersインスタンスに作業要求をルーティングします。サービスに基づいてキャッシュから接続を選択して作業要求を実行すると、スループットが大幅に増加し、スケーラビリティが向上します。
この項では、アプリケーションが暗黙的接続キャッシュを使用する方法を説明します。内容は次のとおりです。
アプリケーションは、OracleDataSource.setConnectionCachingEnabled(true)
をコールすることにより、暗黙的接続キャッシュを有効にします。暗黙的キャッシュを有効にすると、OracleDataSource
クラスへの最初の接続要求により、透過的に接続キャッシュが作成されます。
例21-1に、暗黙的接続キャッシュを使用したサンプル・コードを示します。
例21-1 暗黙的接続キャッシュの使用
// Example to show binding of OracleDataSource to JNDI, // then using implicit connection cache import oracle.jdbc.pool.*; // import the pool package Context ctx = new InitialContext(ht); OracleDataSource ods = new OracleDataSource(); // Set DataSource properties ods.setUser("Scott"); ods.setConnectionCachingEnabled(true); // Turns on caching ctx.bind("MyDS", ods); // ... // Retrieve DataSource from the InitialContext ods =(OracleDataSource) ctx. lookup("MyDS"); // Transparently create cache and retrieve connection conn = ods.getConnection(); // ... conn.close(); // return connection to the cache // ... ods.close() // close datasource and clean up the cache
接続キャッシュを有効にすると、OracleDataSource.getConnection
メソッドを通じて接続を取り出すたびに、キャッシュ内に接続が存在するかどうかがJDBCドライバによって確認されます。
getConnection
メソッドは、キャッシュ内に、指定された条件に一致する未使用の物理接続が存在するかどうかをチェックします。一致するものが見つかった場合、物理接続をラップした状態で論理接続が戻されます。一致する物理接続が見つからなかった場合は、新しい物理接続が作成され、論理接続にラップされて戻されます。
getConnection
には、接続キャッシュを参照しないもの2つと、キャッシュが戻す接続の種類を指定するもの2つの、4つの種類があります。キャッシュ固有でないgetConnection
メソッドは、標準的に動作します。
注意: 暗黙的接続キャッシュを有効にすると、OracleDataSource.getConnection から戻される接続の状態がリセットされない場合があります。したがって、接続をキャッシュに戻す前に、すべての接続の状態(自動コミット、バッチ・サイズ、プリフェッチ・サイズ、トランザクション・ステータス、トランザクション分離など)をリセットする必要があります。 |
OracleDataSource
のConnectionCacheName
プロパティは、Connection Cache Managerが接続キャッシュを管理するために使用するオプションのプロパティです。このプロパティを設定するには、次のメソッドをコールします。
public void synchronized setConnectionCacheName(String cacheName) throws SQLException
このプロパティを設定した場合は、その名前を使用して、キャッシュを有効にするOracleDataSource
がアクセスするキャッシュが一意に識別されます。このプロパティを設定しない場合は、DataSourceName#HexRepresentationOfNumberOfCaches
という命名規則を使用して、デフォルトのキャッシュ名が作成されます。
注意: getConnectionCacheName() メソッドは、setConnectionCachingEnabled メソッドがコールされた後にsetConnectionCacheName メソッドがコールされた場合にのみ、接続キャッシュの名前を戻します。 |
暗黙的接続キャッシュの動作を詳細に設定するには、setConnectionCacheProperties
メソッドを使用して様々な接続プロパティを設定します。
注意:
|
アプリケーションは、close
メソッドをコールすることにより、キャッシュに接続を戻します。close
メソッドには、引数のないものと、Connection
オブジェクトを引数にとるものの、2つの変種があります。
注意:
|
例21-2に、データソースの作成、キャッシュおよびデータソース・プロパティの設定、接続の取出し、およびキャッシュに戻すための接続のクローズを示します。
例21-2 接続キャッシュの例
import java.sql.*; import javax.sql.*; import java.util.*; import javax.naming.*; import javax.naming.spi.*; import oracle.jdbc.*; import oracle.jdbc.pool.*; ... // create a DataSource OracleDataSource ods = new OracleDataSource(); // set cache properties java.util.Properties prop = new java.util.Properties(); prop.setProperty("MinLimit", "2"); prop.setProperty("MaxLimit", "10"); // set DataSource properties String url = "jdbc:oracle:oci8:@"; ods.setURL(url); ods.setUser("hr"); ods.setPassword("hr"); ods.setConnectionCachingEnabled(true); // be sure set to true ods.setConnectionCacheProperties (prop); ods.setConnectionCacheName("ImplicitCache01"); // this cache's name // We need to create a connection to create the cache Connection conn = ds.getConnection(user, pass); Statement stmt = conn.createStatement(); ResultSet rset = stmt.executeQuery("select user from dual"); conn.close(); ods.close();
データソースから取得した各接続には、ユーザー定義属性を指定できます。属性は、アプリケーション開発者によって指定される、java.lang.Properties
の名前と値のペアです。
開発者は、接続属性を使用して、接続を識別するためのセマンティクスを指定できます。たとえば、アプリケーションでconnection_type
という名前の属性を作成し、これに値payroll
またはinventory
を割り当てることができます。
注意: 接続属性のセマンティクスはすべてアプリケーションで定義します。接続キャッシュ自体は、接続属性のキーまたは値に制約を規定しません。 |
接続属性を取得および設定するメソッドは、OracleConnection
インタフェースに存在します。この項の内容は次のとおりです。
初めて取り出す接続には属性がありません。そのため、属性を設定する必要があります。接続の属性を設定した後、getConnection
メソッドの特殊な形式を使用することにより、その接続を属性の指定によって要求できます。
getConnection(java.util.Properties cachedConnectionAttributes
指定されたcachedConnectionAttributes
に一致するデータベース接続を要求します。
getConnection(java.lang.String user, java.lang.String password, java.util.Properties cachedConnectionAttributes)
指定されたuser
、password
およびcachedConnectionAttributes
に一致するデータベース接続を暗黙的接続キャッシュから要求します。user
およびpassword
についてNULL値が渡された場合、DataSource
のデフォルト値が使用されます。
属性一致規則
connectionAttributes
の一致規則には、次の2種類があります。
基本
この種類では、キャッシュが検索され、属性に一致する接続が取り出されます。接続検索メカニズムの内容は、次のとおりです。
完全に一致するものが見つかった場合、接続がコール元に戻されます。
完全一致が見つからず、ClosestConnectionMatch
データソース・プロパティが設定されている場合、最も近似のものが戻されます。最も近似の一致の接続は、元の属性の一致が最も多かったものです。最も近似の一致の接続は、元の属性のサブセットに一致しても、元のリストの一部ではない属性を持っていない可能性があります。たとえば、元の属性リストがA、BおよびCの場合、近似の一致はAおよびBを持っていても、Dを持っていない可能性があります。
既存の接続のいずれとも一致しない場合、新しい接続が戻されます。新しい接続は、DataSource
で設定されているユーザー名およびパスワードを使用して作成されます。getConnection(String, String, java.util.Properties)
がコールされると、引数として渡されたユーザー名とパスワードを使用して新しい接続がオープンされます。
拡張
この種類では、属性が重みに関連付けられます。接続検索メカニズムは基本のconnectionAttributes
に基づいた検索と同様ですが、接続がconnectionAttributes
にのみ基づいて検索されるのではなく、connectionAttributes
のキーに関連付けられた重みも使用して検索されます。これらの重みは、1回のみの操作としてキーに関連付けられ、接続キャッシュ・プロパティAttributeWeights
としてサポートされます。
アプリケーションは、次のメソッドを使用して接続属性を設定します。
applyConnectionAttributes(java.util.Properties connAttr)
connAttr
は検証されません。接続属性の適用は累積されます。applyConnectionAttributes
をコールするたびに、ユーザーが提供するconnAttr
属性は、既存のものに追加されます。
指定された属性の接続がアプリケーションによって要求された際、接続キャッシュ内に一致するものがない可能性があります。このような場合、接続キャッシュは属性を持たない接続を作成し、これを戻します。Connection Cache Managerは属性のセマンティクスを識別できないため、接続キャッシュは要求された属性の接続を作成できません。
注意: closestConnectionMatch プロパティが設定されている場合、キャッシュ・マネージャは完全一致ではなく近似の一致を検索します。 |
このため、アプリケーションは戻された接続の属性を必ず確認する必要があります。そのためには、getUnMatchedConnectionAttributes
メソッドを使用します。このメソッドは、接続を取得する際に一致しなかったすべての属性のリストを戻します。このメソッドの戻り値がnull
の場合、すべての接続属性を設定する必要があることがわかります。
例21-3に、接続属性の使用方法を示します。
例21-3 接続属性の使用
java.util.Properties connAttr = new java.util.Properties(); connAttr.setProperty("connection_type", "payroll"); // retrieve connection that matches attributes Connection conn = ds.getConnection(connAttr); // Check to see which attributes weren't matched unmatchedProp = ((OracleConnection)conn).getUnMatchedConnectionAttributes(); if ( unmatchedProp != null ) { // apply attributes to the connection ((OracleConnection)conn).applyConnectionAttributes(connAttr); } // verify whether conn contains property after apply attributes connProp = ((OracleConnection)conn).getConnectionAttributes(); listProperties (connProp);
接続キャッシュ・プロパティは、接続キャッシュの特性を管理します。この項では、サポートされている接続キャッシュ・プロパティについて説明します。内容は次のとおりです。
アプリケーションは、次のいずれかの方法でキャッシュ・プロパティを設定します。
OracleDataSource
メソッドsetConnectionCacheProperties
を使用して設定する。
OracleConnectionCacheManager
を使用してキャッシュを作成する際に設定する。
OracleConnectionCacheManager
を使用してキャッシュを再初期化する際に設定する。
これらのプロパティは、キャッシュのサイズを制御します。
InitialLimit
キャッシュの作成時または再初期化時にキャッシュ内に作成される接続数を設定します。このプロパティに0より大きい整数値を設定すると、キャッシュを作成または再初期化した際、指定された数の接続が自動的に作成され、前もってキャッシュを満たします。
デフォルト: 0
MaxLimit
キャッシュが保持できる接続インスタンス数の最大値を設定します。デフォルト値はInteger.MAX_VALUE
で、これは、接続キャッシュにより強制される制限がなく、接続の数は、データベースに対して構成されるデータベース・セッションの数によってのみ制限されることを意味します。
デフォルト: Integer.MAX_VALUE
(制限なし)
注意: 同時接続数がデータベース・サーバーで構成した最大セッション数を超えると、ORA-00018 エラーが発生します。このエラーを回避するには、MaxLimit プロパティの値を設定する必要があります。この値は、データベース・サーバー用に構成したSESSIONS パラメータより小さい値にします。 |
MaxStatementsLimit
接続がオープン状態にできる文の最大数を設定します。キャッシュでこのプロパティが設定されていると、キャッシュを再初期化するかデータソースをクローズした場合、MaxStatementsLimit
を超えた数のすべてのカーソルが自動的にクローズされます。
デフォルト: 0
MinLimit
キャッシュが保持する接続の最小数を設定します。
デフォルト: 0
注意:
|
これらのプロパティは、キャッシュ内の要素の存続期間を制御します。
InactivityTimeout
物理接続が接続キャッシュ内にアイドル状態で存続できる最大期間を設定します。アイドルな接続とは、アクティブでなく、論理ハンドルが関連付けられていない接続です。InactivityTimeout
が期限切れになると、基礎となる物理接続がクローズされます。ただし、minLimit
が設定されている場合、キャッシュのサイズはそれを下回りません。
デフォルト: 0(タイムアウトなし)
TimeToLiveTimeout
論理接続がオープン状態でいられる最大期間を秒単位で設定します。TimeToLiveTimeout
が期限切れになると、論理接続は無条件にクローズされ、関連付けられた文ハンドルは取り消され、基礎となる物理接続は再利用のためにキャッシュに戻されます。
デフォルト: 0(タイムアウトなし)
AbandonedConnectionTimeout
接続がクローズされてキャッシュに戻されるまでに、接続が使用されずに維持される最大期間を設定します。SQLデータベース・アクティビティがない場合、接続は使用されていないとみなされます。
AbandonedConnectionTimeout
が設定されると、JDBCによって各論理接続のSQLデータベース・アクティビティが監視されます。たとえば、stmt.execute
が接続に対してコールされると、この接続がアクティブであることを伝えるハートビートが登録されます。ハートビートは、データベースの実行ごとに設定されます。指定された期間、接続が非アクティブであると、基礎となる接続は再生され、再利用のためにキャッシュに戻されます。
デフォルト: 0(タイムアウトなし)
PropertyCheckInterval
Connection Cache Managerがすべての指定されたキャッシュ・プロパティを確認および強制する時間隔を設定します。PropertyCheckInterval
は秒単位で設定されます。
デフォルト: 900秒
関連項目: 『Oracle Database Net Services管理者ガイド』 |
これらのプロパティは、様々なキャッシュの動作を制御します。
AttributeWeights
AttributeWeights
は、接続に設定された各属性の重みを設定します。
ClosestConnectionMatch
ClosestConnectionMatch
は、指定された接続属性と最も近似した接続を接続キャッシュによって取り出します。
ConnectionWaitTimeout
接続が要求されたが、アクティブな接続がすでにMaxLimit本ある場合のキャッシュ動作を指定します。ConnectionWaitTimeout
がゼロの場合、各接続要求は0秒待機します。つまり、null
接続が即座に戻されます。ConnectionWaitTimeout
がゼロより大きい場合、各接続要求は、指定された秒数、または接続がキャッシュに戻されるまでの間、待機します。接続がキャッシュに戻されないままタイムアウトした場合、接続要求はnull
を戻します。
デフォルト: ゼロ
LowerThresholdLimit
キャッシュの最低のしきい値を設定します。デフォルトは、接続キャッシュのMaxLimit
の20%です。このプロパティは、releaseConnection()
キャッシュのコールバック・メソッドが使用されている場合は必ず使用されます。
ValidateConnection
ValidateConnection
にtrue
を設定すると、接続キャッシュが取り出した接続は、すべて、基礎となるデータベースに対して検証されます。有効な接続が取り出せない場合は、例外が発生します。
デフォルト: false
注意: Oracle Database 11gリリース1(11.1)以上では、接続キャッシュの動作が変更されています。ValidateConnection プロパティとデータベースのCONNECT_TIME リソース制限の両方が有効である場合、接続キャッシュは、例外を発行せずに、CONNECT_TIME 制限に設定されている値を超える接続を戻します。次回この接続で文が実行されると、かわりに例外が発行されます。
|
例21-4に、アプリケーションが接続プロパティを使用する方法を示します。
例21-4 接続プロパティの使用
import java.sql.*; import javax.sql.*; import java.util.*; import javax.naming.*; import javax.naming.spi.*; import oracle.jdbc.*; import oracle.jdbc.pool.*; ... OracleDataSource ds = (OracleDataSource) ctx.lookup("..."); java.util.Properties prop = new java.util.Properties (); prop.setProperty("MinLimit", "5"); // the cache size is 5 at least prop.setProperty("MaxLimit", "25"); prop.setProperty("InitialLimit", "3"); // create 3 connections at startup prop.setProperty("InactivityTimeout", "1800"); // seconds prop.setProperty("AbandonedConnectionTimeout", "900"); // seconds prop.setProperty("MaxStatementsLimit", "10"); prop.setProperty("PropertyCheckInterval", "60"); // seconds ds.setConnectionCacheProperties (prop); // set properties Connection conn = ds.getConnection(); conn.dosomework(); java.util.Properties propList=ds.getConnectionCacheProperties(); // retrieve
OracleConnectionCacheManager
では、使用可能な接続キャッシュを中間層によって管理するための管理APIを提供しています。この項では、Connection Cache Managerの使用例を示します。
ConnectionCacheManagerの使用例
例21-5に、OracleConnectionCacheManager
インタフェースを示します。
例21-5 Connection Cache Managerの例
import java.sql.*; import javax.sql.*; import java.util.*; import javax.naming.*; import javax.naming.spi.*; import oracle.jdbc.*; import oracle.jdbc.pool.*; ... // Get singleton ConnectionCacheManager instance OracleConnectionCacheManager occm = OracleConnectionCacheManager.getConnectionCacheManagerInstance(); String cacheName = "foo"; // Look for a specific cache // Use Cache Manager to check # of available connections // and active connections System.out.println(occm.getNumberOfAvailableConnections(cacheName) " connections are available in cache " + cacheName); System.out.println(occm.getNumberOfActiveConnections(cacheName) + " connections are active"); // Refresh all connections in cache occm.refreshCache(cacheName, OracleConnectionCacheManager.REFRESH_ALL_CONNECTIONS); // Reinitialize cache, closing all connections java.util.Properties newProp = new java.util.Properties(); newProp.setProperty("MaxLimit", "50"); occm.reinitializeCache(cacheName, newProp);
この項では、暗黙的接続キャッシュの理解や使用にとって必須ではないが、上級者には役立つキャッシュ機能について説明します。この項の内容は次のとおりです。
getConnection
要求に対し、接続キャッシュ内の適切な接続を指定するために開発者が使用できる接続キャッシュ・プロパティは2つあります。ClosestConnectionMatch
プロパティにtrue
を設定すると、Connection Cache Managerは、指定された属性の一部のみ一致する接続を戻します。
attributeWeights
を指定しない場合、一致する属性が最も多い接続がConnection Cache Managerによって戻されます。attributeWeights
を指定すると、属性を一致する際にマネージャによって使用される優先順位を制御できます。
ClosestConnectionMatch
ClosestConnectionMatch
にtrue
を設定すると、指定された接続属性と最も近似した接続が接続キャッシュによって取り出されます。これとAttributeWeights
を組み合せることにより、最も近似した一致を指定できます。
デフォルト: false
AttributeWeights
各connectionAttribute
の重みを設定します。このプロパティは、一致を検索する際、どの属性の優先順位が最も高いかを決定するために、ClosestConnectionMatch
にtrue
が設定されている場合に使用されます。重みが高い属性は、重みが低い属性よりも、一致を決定する際に重要視されます。
AttributeWeights
には、キー/値ペアを表すString
のセットが含まれています。各キー/値ペアのセットには、ユーザーが接続を要求する各connectionAttribute
の重みを設定します。各String
は、java.util.Properties.Store(OutputStream, String)
メソッドで記述される形式であるため、java.util.Properties.load(InputStream)
メソッドで読み取ることができます。Key
はconnectionAttribute
、Value
は重みです。重みは0より大きい整数値の必要があります。デフォルトの重みは1です。
たとえば、TRANSACTION_ISOLATION
に10の重み、ROLE
に5の重みを割り当てます。ClosestConnectionMatch
をtrue
に設定し、connectionAttribute
に基づいてキャッシュに接続が要求されると、一致するTRANSACTION_ISOLATION
を持つ接続は、一致するROLE
を持つ接続よりも優先されます。
デフォルト: AttributeWeights
なし
暗黙的接続キャッシュを使用することにより、接続キャッシュがコールするコールバックをアプリケーションによって指定できます。コールバック・メソッドは、OracleConnectionCacheCallback
インタフェースによってサポートされます。このコールバック・メカニズムは、特定の接続に対するアプリケーションの認識を利用し、放棄された接続の処理や、キャッシュが空の場合のデフォルトの動作を補完する際に役立ちます。
OracleConnectionCacheCallback
は、ユーザーが実装し、OracleConnection
に登録する必要のあるインタフェースです。登録APIは次のとおりです。
public void registerConnectionCacheCallback( OracleConnectionCacheCallback cbk, Object usrObj, int cbkflag);
このインタフェースで、cbk
はOracleConnectionCacheCallback
インタフェースのユーザーによる実装です。usrObj
パラメータには、ユーザーが提供する任意のパラメータが含まれます。コールバック・メソッドがコールされると、このユーザー・オブジェクトは変更されずに戻されます。cbkflag
パラメータは、コールするコールバック・メソッドを指定します。次の値のうち1つを設定する必要があります。
OracleConnection.ABANDONED_CONNECTION_CALLBACK
OracleConnection.RELEASE_CONNECTION_CALLBACK
OracleConnection.ALL_CALLBACKS
ALL_CALLBACKS
が設定されると、すべての接続キャッシュのコールバック・メソッドがコールされます。たとえば、次のようになります。
// register callback, to invoke all callback methods ((OracleConnection)conn).registerConnectionCacheCallback( new UserConnectionCacheCallback(), new SomeUserObject(), OracleConnection.ALL_CALLBACKS);
アプリケーションは、OracleConnection
にConnectionCacheCallback
を登録できます。コールバックが登録されると、接続キャッシュは接続を再生する前に、コールバックのhandleAbandonedConnection
メソッドをコールします。コールバックがtrue
を戻すと、接続は再生されます。コールバックがfalse
を戻すと、接続はアクティブ状態のままになります。
UserConnectionCacheCallback
インタフェースは、releaseConnection
およびhandleAbandonedConnection
という、ユーザーが実装する2つのコールバック・メソッドをサポートしています。
次に、暗黙的接続キャッシュで使用される、TimeToLiveTimeout
とAbandonedConnectionTimeout
のタイムアウト・メカニズムのユースケースについて説明します。これらのタイムアウト・メカニズムは、接続キャッシュから取り出された論理接続に適用できます。
接続が完全にステートレスであるとアプリケーションでみなされる場合
接続がステートレスである場合は、どちらかのタイムアウト・メカニズムを使用できます。タイムアウトが期限切れとなった接続は、再利用のために接続キャッシュに戻されます。これらの接続には、関連付けられたセッション状態がないため、再利用の対象として有効です。
各接続の状態がアプリケーションで維持されるが、接続キャッシュに戻された接続をステートレスにできるクリーン・アップ・ルーチンがアプリケーションにある場合
この場合、TimeToLiveTimeout
は使用できません。接続キャッシュの側で、接続が必ず再使用可能な状態でキャッシュに戻されるように保証する手段はありません。ただし、このシナリオでは、その接続上でOracleConnectionCacheCallback
が登録されている場合のみ、AbandonedConnectionTimeout
を使用できます。handleAbandonedConnection
コールバック・メソッドはアプリケーションにより実装され、必要なクリーン・アップが完了していることを保証します。タイムアウト処理がこのコールバック・メソッドを起動すると、接続はクローズされます。この接続をコールバック・メソッドによってクローズすると、接続は再使用できる状態で接続キャッシュに戻されます。
注意: handleAbandonedConnectionメソッドをコールした後に接続をクローズしないでください。接続が無効な状態になる可能性があります。JDBCは、接続が無効な状態にある場合でも、接続を回収する方法を内部的に認識しています。 |
各接続の状態がアプリケーションで維持されるが、接続は管理されず、他のアプリケーションやユーザーによる再利用のために状態をクリーン・アップできない場合
どちらのタイムアウト・メカニズムも、使用はお薦めしません。