一般に中間層で実装される接続キャッシュは、物理データベース接続のキャッシュを維持し、使用するための手段です。
|
注意: 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は、接続が無効な状態にある場合でも、接続を回収する方法を内部的に認識しています。 |
各接続の状態がアプリケーションで維持されるが、接続は管理されず、他のアプリケーションやユーザーによる再利用のために状態をクリーン・アップできない場合
どちらのタイムアウト・メカニズムも、使用はお薦めしません。