3.3 UCPでの接続の検証の概要
接続は、接続の流用時にプールのプロパティを使用して検証できます。また、ValidConnection
インタフェースを使用してプログラムで検証することもできます。この項では、これら2つの方法について詳しく説明します。無効な接続は、アプリケーションのパフォーマンスおよび可用性に影響を及ぼす可能性があります。
3.3.1 流用時の検証
-
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 19cリリースで使用できる新しいメソッドを示します。
メソッド | 説明 |
---|---|
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
メソッドによってデータベースへのラウンドトリップが発生します。このラウンドトリップを使用して、プールまたはドライバですぐには検出されないデータベース障害がないかをチェックします。 -
Oracle Databaseリリース18c以降、ピンポン・プロトコルを使用してデータベースへの完全なラウンドトリップを行うメソッドの旧バージョンとは異なり、空のパケットをデータベースに送信する
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
にキャストすると、例外がスローされることがあります。
関連トピック