JBossとOracleは別々のサーバーにあります。接続が切断されているようで、JBossで問題が発生しています。最初に接続がドロップされている理由を理解しているうちに、接続が悪い場合は、JBossをOracleに再接続するにはどうすればよいですか?接続が悪くなったときにJBoss接続プールをOracleに再接続する方法はありますか?
答えて
プールには通常、借用時に検証クエリを実行できる設定オプションがあります。検証クエリが正常に実行された場合、プールはその接続を返します。クエリが正常に実行されない場合、プールは新しい接続を作成します。
JBoss Wikiには、プールのさまざまな属性が記載されています。
<check-valid-connection-sql>select 1 from dual</check-valid-connection-sql>
トリックを行うように見えます。
古い「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のベースと - クエリ
あなたが要件ごとに使用することができます
をもと :'Select one from dual'とorg.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionCheckerメソッドは同等ですが、接続チェックでは抽象レベルが提供されます。トラブルシューティングのためにoracle jdbcドライバを逆コンパイルしなければならず、接続チェックで使用されたpingの内部実装は、 'Select' x 'from dual'を実行する必要があります。ナッチ。 – abh
JBoss AS 4と5では、「OracleValidConnectionChecker」に[マイナーなバグ](https://bugzilla.redhat.com/show_bug.cgi?id=699816)があることに注意してください。フードの下に別個のピンガー糸を使用することによる。 – Vadzim
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;
}
}
ないコメントのための十分な担当者、それは答えの形でですので。 'Select 1 from dual'
とskaffmanのorg.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker
メソッドは同等ですが、接続チェックでは抽象化レベルが提供されます。トラブルシューティングのためにoracle jdbcドライバを逆コンパイルする必要があり、Oracleのpingの内部実装は'Select 'x' from dual'
を実行する必要があります。ナッチ。
@ skaffmanの答えに少し更新されました。 JBossの7では、あなたは、有効な接続チェッカーを設定するときに、「クラス名」属性を使用する必要があり、また、パッケージが異なります。
<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker" />
我々は最近、孤立神託により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分にセッションの有効期限を強制的になく、アプリケーションの動作には影響しませんソリューションです。これをテストしてください。非常に素晴らしいトリックです。 –
これはとても滑らかです。 –
30/60/24は何を表していますか? –
- 1. 接続の中断後にOracle接続プールを自動再接続する方法はありますか。
- 2. JBossデータベース接続プール
- 3. .NetへのOracle接続 - 接続プール
- 4. SqlServerに接続するときに「UserActionEventの接続プールがありません」
- 5. wildfly接続プールから接続する方法はありますか?
- 6. 接続が接続プールで消えた
- 7. 接続後にAFNetworkingが再接続する方法がありません
- 8. は、私は、データベースへの接続時に接続プールを使用する必要があるアプリケーションを持って動的にMySQLの接続/ J接続プール
- 9. Glassfish Derby接続プール、接続がプールに返されない
- 10. c3p0プールされた接続ファントム接続
- 11. 接続プールが
- 12. redigo接続プール - 古くなった接続を削除するときにリリースロックを解除する理由
- 13. 多くのオープンした接続の接続プールは、毎回新しい接続を開くよりも、システムにとってコストがかかりません。
- 14. C#接続プールでオープン接続を維持する必要があります
- 15. ADO.NET接続プールで使用できる接続がありません
- 16. Oracle接続Springフレームワークによるプール
- 17. SQL Server接続が接続プールによって閉じられる前に、接続がアイドル状態になる必要がありますか。
- 18. Jdbc接続プール(ユーザー名別接続キャッシュあり)
- 19. Java、JDBC接続プール、JDBC接続ロールバック
- 20. 単一接続の接続プール
- 21. Tomcatの接続プール、接続タイムアウト
- 22. 接続プール内の接続の解放。
- 23. OrientDB接続プール
- 24. cx_Oracle接続プール
- 25. EventHub接続プール
- 26. 接続プールJava
- 27. TCP接続プール
- 28. JDBC接続プール
- 29. mongodb接続プール
- 30. リポジトリ接続プール
すでにcfgにその行がある場合は、「validate-on-match」と「background-validation」の両方がfalseに設定されていないことも確認してください(詳細は、リンクされたwikiページを参照してください)。 – Pino