0

私はproxool Java 接続プール (バージョン 0.9.1) を使用しています。最大接続数に達するまで、すべて正常に動作します。最大接続数に達すると、proxool はすぐに以下をスローしSQLExcepionます。

java.sql.SQLException: Couldn't get connection because we are at maximum 
connection count (n/n) and there are none available

もちろん、代わりにn最大接続数が表示されます。

SQLException利用可能な接続を待つのではなく、proxool がすぐにスローするのはなぜですか? もちろん永遠ではありませんが、構成可能なタイムアウトは素晴らしいでしょう。

重要かどうかはわかりませんが、Tomcat J2EE アプリケーションで proxool を使用しています。proxool のパラメーターは で定義されており、 Proxool DataSource Supportcontext.xmlを使用しています。

4

3 に答える 3

2

私は proxool メーリング リストで質問をしていましたが、残念ながら否定的な回答がすぐに得られました。

現在、構成可能な (またはあらゆる種類の) タイムアウトはサポートされていませんが、この機能を実装する計画があります。

于 2009-03-06T14:58:22.777 に答える
1

ソース コードをざっと見てみると、これは ConnectionPool.getConnection の標準的な動作のようです。ドキュメントには同じことが書かれています。

他のデータベース プーリング ライブラリ (Apache DBCP や C3P0 など) もありますが、それらを使用するにはリファクタリングを行う必要があります。もう 1 つの方法は、getConnection メソッドを自分でラップして (または proxool ソースを変更して)、希望どおりに動作させることです。

于 2009-03-04T20:10:28.363 に答える
0

Thread.sleep() を使用して処理できます。最大接続数に達すると、Proxool は例外をスローします。それを検出したら、「Thread.sleep()」を呼び出してしばらく待つことができます。うまくいけば、この時間が経過すると、接続が再び利用できるようになります。

public Connection getConnection() が SQLException をスローします {
    接続接続 = null;
    while (conn ==null){
      試す {
        conn = DriverManager.getConnection("proxool."+connectionPoolAlias);
      } キャッチ (SQLException e) {
        e.printStackTrace();
        String methodName =e.getStackTrace()[0].getMethodName();
        if (methodName.equalsIgnoreCase("checkSimultaneousBuildThrottle") ||
                                     methodName.equalsIgnoreCase("quickRefuse")){
          試す{
            Thread.sleep(500);
          }catch(InterruptedException ie){}
        }そうしないと{
          eを投げます。
        }
      }
    }
    conn を返します。
  }
于 2009-05-27T09:45:06.627 に答える