4

JBoss 6.1 の JDBC プールでかなり厄介なリークが発見されました。

closeこれは、基になるステートメントを閉じるために接続のメソッドに依存するコードが原因です。

WrappedConnectionはそれらを閉じますが、コードは次のようになります

if (statements != null) {
  for (Iterator
       <Map.Entry<WrappedStatement, Throwable>> i=statements.entrySet().iterator(); 
       i.hasNext(); )
  {
     Map.Entry<WrappedStatement, Throwable> entry = i.next(); 
     WrappedStatement ws= entry.getKey();
     if (trackStatements==BaseWrapperManagedConnectionFactory.TRACK_STATEMENTS_TRUE_INT)
     {
       Throwable stackTrace = entry.getValue();
       log.warn("Closing a statement you left open, please do your own housekeeping",
                 stackTrace);
     }
     try
     {
       ws.internalClose();
     }
     catch (Throwable t)
     {
       log.warn("Exception trying to close statement:", t);
     }
   }
 }

ステートメント オブジェクトはマップからステートメントを削除することはなく、マップはどんどん大きくなり、それらのステートメントは結果セットなどを保持します (少なくとも私が使用している JDBC ドライバーでは)。

JBoss の jdbc プールを、これよりも堅牢な代替実装に置き換えた人がいるのだろうか?


これに対する小さな補足として、コードと動作は結果セットと同じです (基本的にコピー アンド ペースト)。設計によりプールに存在する接続)。

4

2 に答える 2

4

基になるステートメントを閉じられないことは、JBOSS プーリング リークではありません。責任は、データベース ベンダーの JDBC ドライバーの実装にあると思います。私の記憶が正しければ、接続が閉じられたときに Oracle のドライバーが基盤となるリソースを閉じなかったことはよく知られています (少なくとも 2006 年にはそうでした)。修正されたかどうかはわかりません。

http://www.theserverside.com/discussions/thread.tss?thread_id=41036

責任は常にあなたにあります。

作成とは逆の順序で、try/catch ブロックで個別にラップされた finally ブロックですべての ResultSet および Statement インスタンスを閉じることをお勧めします。

それが正しく、同意する場合は、プールの実装を変更するだけでは十分ではありません。コードを調べて、自分で行う必要があります。スマートでクリーンな永続層で設計されている場合は、比較的簡単なはずです。

以前にコードを読んでおらず申し訳ありません。なぜあなたが、特にStatementではないものを入れているのかわかりません。私のアドバイスは、永続層内ですべてのインスタンスをしっかりとバインドすることです。メソッドスコープでそれらを作成して閉じます。キャッシングなし。MapWeakHashMapStatementResultSet

コードのプロファイリングを行った場合、ここで節約できるものは何もないことがわかると思います。これらのクラスはいずれもスレッド セーフではないため、これらのクラスにぶら下がると、厄介なバグが発生する可能性があります。アプリのスケーラビリティも大幅に向上します。

于 2012-05-15T23:18:11.130 に答える
2

JBoss は、データソースの接続プールをリソース アダプタ RAR としてデプロイします。デフォルトでは、2 つの利用可能なフォルダがjboss-local-jdbc.rarあります。使用する接続ファクトリとラッパーはで宣言されていますjboss-xa-jdbc.rardeployMETA-INF/ra.xml

したがって、オプションは、宣言されたデータソースに従って、これらのリソース アダプタの 1 つまたは両方を置き換えることです。ただし、実装では、JTS を使用したトランザクションへのリソースの登録とセキュリティ チェックをサポートする必要があります。

それほど簡単な仕事ではなく、おそらくあなたが最初の仕事になるでしょう。

于 2012-06-11T14:48:22.190 に答える