2

DBCP2 BasicDataSource を使用してデータベース接続を管理しています。テストするときは、getNumActive() と getNumIdle() を使用してプールのステータスを出力します。アイドル接続は常に0ですが、アクティブな接続は増加し続けます。

これが私のコードです:

    public static Connection getCnn() throws Exception {
    Connection cnn = null;
    if (ds.isClosed()){
        init();
        logger.warn("DataSource is closed. Rebuild BasicDataSource from getCnn");
    }
    logger.trace("Request for connection");
    cnn = ds.getConnection();
    // Monitor current connecton pool 
    // change to logger.trace in future for performance.
    logger.warn("Current Connection Pool: " 
        + "\n MaxTotal of connection - " + String.valueOf(maxTotal)
        + "\n Number of active connection - " + String.valueOf(ds.getNumActive())
        + "\n Number of idle connecton - " + String.valueOf(ds.getNumIdle()));
    return cnn;

私の BasicDataSource 構成は

   MinIdle = "8"
   MaxIdle = "16"
   MaxTotal = "-1"
   maxOpenPreparedStatements = "256"
   RemoveAbandonedTimeout = "300"
   RemoveAbandonedOnBorrow = "true"

そして、出力はアイドル接続番号であり、接続がアイドルになるのをどれだけ待っても、アクティブな接続は常に増加し続けます。

では、どのような状態で接続が「アイドル」になるのでしょうか? 接続を強制的にアイドル状態にするタイムアウト設定が見つかりません。

どんな洞察も大歓迎です!

4

1 に答える 1

1

接続オブジェクトを閉じているかどうかわかりません。接続オブジェクトを閉じると、アクティブな接続が減少し、アイドル状態の接続が増加します。

「ds.getConnection()」を実行すると、接続 (オブジェクト) が作成されるか、作成済みの接続 (オブジェクト) がクローズされて取得されて返されます。受信した接続オブジェクトは、close が呼び出されるまでアクティブと見なされます。再利用の準備ができている閉じられた接続オブジェクトは、アイドル接続です。

于 2020-04-02T07:45:49.247 に答える