1

以下のように接続プールから接続を取得し、接続で何かをするのに60秒かかる Runnable があります。

private static ConnectionPoolDataSource cpds; // MysqlConnectionPoolDataSource

public void run(){
    while((System.currentTimeMillis()-created)<60000){
        try(Connection conn = cpds.getPooledConnection().getConnection()){  
            //do something
        }catch(SQLException sqle){}
    }
}

スレッドが 60 秒後に終了すると、接続がプールに返され、新しいスレッドが作成されたときに接続を再利用できると想定しました。しかし、ネットワーク接続を一覧表示すると、作成されるスレッドが増えるにつれて、一覧が増え続けます。上記のように作成された接続はプールに正しく返されますか? その場合、接続を強制的に再利用するにはどうすればよいですか?

4

2 に答える 2

5

実際には接続プールを使用していません。AConnectionPoolDataSourceは、直接使用することを意図していません。これは、接続プールを提供する (通常の)実装によって接続プールに保持さDataSourceれるオブジェクトの (特別な) ものとして意図されています。PooledConnectionDataSource

通常の開発者は をConnectionPoolDataSource直接使用すべきではありません。これは、アプリケーション サーバーによって提供される接続プールで使用するか、接続プールを提供する汎用DataSourceの にラップすることを目的としています。

Connection接続プールから要求されると、既存の をチェックアウトPooledConnection(または から新しいものを要求ConnectionPoolDataSource) し、 を取得Connectionしてユーザーに返します。ユーザーが を閉じるとConnectionPooledConnectionは再び使用可能になったことを接続プールに通知します。

この場合、 を作成しPooledConnection、そこから を取得してConnectionから を破棄していPooledConnectionます。これは、PooledConnectionが放棄され、データベースへの物理接続が再利用できず、最終的にガベージ コレクションが行われるときに閉じられるか破棄されることを意味します (通常、接続プールが物理接続を閉じたい場合は、 が呼び出さclose()れますPooledConnection)。

Application Server が提供する接続プールを使用するか、DBCP、c3p0、BoneCP などの汎用接続プールを使用する必要があります。

于 2012-09-29T08:24:26.233 に答える
1

接続プールに何を使用しているかは言わないので、答えは「おそらく」です。

ただし、ほとんどのプールには、放棄された接続を検出する何らかの方法があります。たとえば、DBCPremoveAbandonedおよびremoveAbandonedTimeout構成パラメーターを提供します。これらはすぐに接続をプールに戻さないため、タイムアウトが期限切れになるまで接続数が増え続けることがわかります (そしてうまくいけば、タイトなループに陥っているので、接続数の最大値を設定しました)。接続を開きます)。

于 2012-09-26T20:46:03.853 に答える