3.3 UCPでの接続の検証の概要

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

3.3.1 流用時の検証

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

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

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

注意:

setSQLForValidateConnectionプロパティは、Oracle JDBCドライバを使用している場合には使用しないでください。Oracle JDBCドライバを使用している場合、UCPは内部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();

3.3.2 setSecondsToTrustIdleConnection()メソッドを使用した接続検証の最小化

UCPでは、setValidateConnectionOnBorrow(boolean)メソッドの値をtrueすると、各接続がチェックアウト中に検証されます。この検証では、データベース接続を頻繁にチェックアウトするアプリケーションの大幅なオーバーヘッドが発生する場合があります。

頻繁な接続検証の影響を最小限に抑えるには、最近使用したまたは最近テストしたデータベース接続を信頼するために適切な値を使用したsetSecondsToTrustIdleConnection(int)メソッドを設定できます。この値を設定すると、接続検証テストがスキップされ、アプリケーション・パフォーマンスが大幅に向上します。

次の表に、この機能を使用するためにOracle Database 12cリリース2(12.2.0.1)で使用できる新しいメソッドを示します。

メソッド 説明
setSecondsToTrustIdleConnection(int secondsToTrustIdleConnection) 最近使用したまたは最近テストしたデータベース接続を信頼するために秒数を設定し、接続チェックアウト中の検証テストをスキップします。
getSecondsToTrustIdleConnection() setSecondsToTrustIdleConnection(int)メソッドを使用して設定された値を取得します。

setSecondsToTrustIdleConnection(int)メソッドを正の値に設定すると、接続がsecondsToTrustIdleConnection(int)メソッドで指定された時間内に使用された場合に接続検証がスキップされます。デフォルト値は、機能が無効であることを意味する0秒です。

注意:

setValidateConnectionOnBorrow(boolean)メソッドがtrueに設定されている場合のみ、setSecondsToTrustIdleConnection(int)メソッドは動作します。setValidateConnectionOnBorrow(boolean)メソッドをtrueに設定せずにsetSecondsToTrustIdleConnection(int)メソッドをゼロ以外の値に設定すると、UCPは次の例外をスローします。

Invalid seconds to trust idle connection value or usage.

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

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

isValidメソッドは、SQL例外がスローされた後でも接続が使用可能かどうかをチェックするために使用されます。また、いつでも流用された接続が有効であるかどうかをチェックするために使用できます。このメソッドは、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から取得されるXAConnectionValidConnectionにキャストする必要があります。XAConnection.getConnection()メソッドをコールして取得されるConnectionValidConnecionにキャストすると、例外がスローされることがあります。