2008-09-24 29 views

答えて

25

プールには通常、借用時に検証クエリを実行できる設定オプションがあります。検証クエリが正常に実行された場合、プールはその接続を返します。クエリが正常に実行されない場合、プールは新しい接続を作成します。

JBoss Wikiには、プールのさまざまな属性が記載されています。

<check-valid-connection-sql>select 1 from dual</check-valid-connection-sql> 

トリックを行うように見えます。

+0

すでにcfgにその行がある場合は、「validate-on-match」と「background-validation」の両方がfalseに設定されていないことも確認してください(詳細は、リンクされたwikiページを参照してください)。 – Pino

30

古い「select one from dual」トリックを使用することができますが、これは、プールから接続を借用するたびに余計なクエリを発行するという欠点があります。大量の場合、これは無駄です。

JBossはOracleのために使用されるべき特別な接続バリデータを提供します。

<valid-connection-checker-class-name> 
    org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker 
</valid-connection-checker-class-name> 

これは、Oracle JDBC接続クラスの独自のping()メソッドを利用して、決定するために、ドライバーの基盤となるネットワークコードを使用しています接続がまだ生きている場合。

しかし、接続を借用するたびにこれを実行するのは無駄なので、バックグラウンドスレッドがプール内の接続をチェックし、死んだプールを静かに破棄する機能を使用することができます。これははるかに効率的ですが、接続がの場合はが死んだ場合、バックグラウンドスレッドがチェックを実行する前にそれらを使用しようとすると失敗します。

バックグラウンドチェックの設定方法についてはwiki docsを参照してください(background-validation-millisを探してください)。 - Pingのベースと - クエリ

あなたが要件ごとに使用することができます

をもと :

+7

'Select one from dual'とorg.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionCheckerメソッドは同等ですが、接続チェックでは抽象レベルが提供されます。トラブルシューティングのためにoracle jdbcドライバを逆コンパイルしなければならず、接続チェックで使用されたpingの内部実装は、 'Select' x 'from dual'を実行する必要があります。ナッチ。 – abh

+0

JBoss AS 4と5では、「OracleValidConnectionChecker」に[マイナーなバグ](https://bugzilla.redhat.com/show_bug.cgi?id=699816)があることに注意してください。フードの下に別個のピンガー糸を使用することによる。 – Vadzim

5

JBossは、接続を検証するには2つの方法を提供します。これは、データソース構成ファイルで定義された期間ごとに別のスレッドによってスケジュールされます。

<background-validation>true</background-validation> <background-validation-minutes>1</background-validation-minutes> 

あなたは、JBossで右Oracleドライバを持っていない場合は、一部の時間、あなたはclasscastまたは関連のエラーを取得することがあり、その接続のための接続プールからのドロップアウトを開始することができます。 org.jboss.resource.adapter.jdbc.ValidConnectionCheckerインターフェイスを実装することで、独自のConnectionValidatorクラスを作成できます。このインタフェースは、単一のメソッド 'isValidConnection()'のみを提供し、有効な接続のために 'NULL'を返すと予想します。

例:

public class OracleValidConnectionChecker implements ValidConnectionChecker, Serializable { 

    private Method ping; 

    // The timeout (apparently the timeout is ignored?) 
    private static Object[] params = new Object[] { new Integer(5000) }; 

    public SQLException isValidConnection(Connection c) { 

     try { 
      Integer status = (Integer) ping.invoke(c, params); 

      if (status.intValue() < 0) { 
       return new SQLException("pingDatabase failed status=" + status); 
      } 

     } 
     catch (Exception e) { 
      log.warn("Unexpected error in pingDatabase", e); 
     } 

     // OK 
     return null; 
    } 
} 
9

ないコメントのための十分な担当者、それは答えの形でですので。 'Select 1 from dual'とskaffmanのorg.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionCheckerメソッドは同等ですが、接続チェックでは抽象化レベルが提供されます。トラブルシューティングのためにoracle jdbcドライバを逆コンパイルする必要があり、Oracleのpingの内部実装は'Select 'x' from dual'を実行する必要があります。ナッチ。

2

@ skaffmanの答えに少し更新されました。 JBossの7では、あなたは、有効な接続チェッカーを設定するときに、「クラス名」属性を使用する必要があり、また、パッケージが異なります。

<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker" />

3

我々は最近、孤立神託によりDBMS_LOCKセッションロックを引き起こしたいくつかの浮動要求処理の障害を持っていましたクライアント側の接続プールに無期限に保持されます。これは、プールからの接続を取得するプロセスでダウンいくつかのスローを伴うことが

<check-valid-connection-sql>select case when 30/60/24 > sysdate-LOGON_TIME then 1 else 1/0 end 
from V$SESSION where AUDSID = userenv('SESSIONID')</check-valid-connection-sql> 

:だからここ

は30分にセッションの有効期限を強制的になく、アプリケーションの動作には影響しませんソリューションです。これをテストしてください。

+0

非常に素晴らしいトリックです。 –

+0

これはとても滑らかです。 –

+0

30/60/24は何を表していますか? –

関連する問題