32

JBoss と Oracle を別々のサーバーに配置しています。接続が切断されたように見え、JBoss で問題が発生しています。そもそも接続が切断されている理由を突き止めている間、接続が悪い場合、JBoss を Oracle に再接続させるにはどうすればよいですか?

4

6 に答える 6

36

古い「デュアルから1つ選択」のトリックを使用できますが、これの欠点は、プールから接続を借用するたびに追加のクエリを発行することです。大量の場合、これは無駄です。

JBossは、Oracleで使用する必要がある特別な接続バリデーターを提供します。

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

これは、Oracle JDBC Connectionクラスの独自のping()メソッドを利用し、ドライバの基盤となるネットワークコードを使用して、接続がまだ有効かどうかを判断します。

ただし、接続を借用するたびにこれを実行するのはまだ無駄なので、バックグラウンドスレッドがプール内の接続をチェックし、デッド接続をサイレントに破棄する機能を使用することをお勧めします。これははるかに効率的ですが、接続切断された場合、バックグラウンドスレッドが実行される前に接続を使用しようとすると、チェックが失敗することを意味します。

バックグラウンドチェックを構成する方法については、 wikiドキュメントを参照してください(を探してくださいbackground-validation-millis)。

于 2008-09-28T13:59:14.033 に答える
28

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

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

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

それはトリックを行う必要があるようです。

于 2008-09-24T19:30:08.323 に答える
10

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

于 2014-06-20T16:56:08.957 に答える
7

JBossは、接続を検証する2つの方法を提供します。-pingベースおよび-クエリベース

要件に応じて使用できます。これは、データソース構成ファイルで定義された期間に従って、別のスレッドによってスケジュールされます。

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

Jbossで適切なOracleドライバーがない場合、クラスキャストまたは関連するエラーが発生し、その接続で接続プールからのドロップアウトが開始されることがあります。インターフェイスを実装することで、独自のConnectionValidatorクラスを作成してみることができorg.jboss.resource.adapter.jdbc.ValidConnectionCheckerます。このインターフェースは単一のメソッド''のみを提供し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;
   }
}
于 2012-06-22T22:04:29.480 に答える
3

最近DBMS_LOCK、クライアント側の接続プールに無期限に保持される孤立した Oracle セッション ロックが原因で、いくつかのフローティング リクエスト処理エラーが発生しました。

したがって、30 分でセッションの有効期限が切れるが、アプリケーションの操作には影響しないソリューションを次に示します。

<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>

これにより、プールから接続を取得するプロセスが遅くなる可能性があります。これを負荷の下で必ずテストしてください。

于 2015-09-29T12:38:34.670 に答える
3

@skaffmanの回答を少し更新。JBoss 7 では、有効な接続チェッカーを設定するときに「class-name」属性を使用する必要があり、パッケージも異なります。

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

于 2014-12-08T15:24:44.080 に答える