0

私はMySQLで動作するサーバーを開発しています。接続プールと開いたままの単一の接続を使用し、アプリケーション全体でさまざまなメソッドに渡されることの利点を理解しようとしています。

接続プールを使用するという考え方は理解されていますが、これがボトルネックを作成するシナリオが存在する可能性があります。これは、プールなしで作業する場合には当てはまりません。

コードを使用して私の意味をよりよく説明してください:

次のメソッドが同時にconnectionPoolSize + 1 (たとえば 10) 回呼び出されたとします。これは、接続プールから接続を使い果たしたことを意味します。最後のクエリの試行は、使用可能な接続がないため失敗します。

public void getData(con) {
    Connection con = null;
    Statement s = null;
    ResultSet rs = null;

    try {
        con = connectionPool.getConnection();
        s = con.createStatement();
        rs = s.executeQuery("SELECT * FROM MY_TABLE;");

        // Some long process that takes a while....

    catch(Exception e) {
        throw new Exception(e.getMessage())
    } finally {
        s.close();
        rs.close();
        con.close();
    }
}

ただし、開いたままの単一の接続を使用していて、すべてのメソッドがそれを使用できる場合、接続がプールに送り返されるのを待つ必要はありません (上記のように、時間がかかる場合があります)。しばらく)。

たとえば、このメソッドも 10 回呼び出します。

public void getData(con) {
    
    Statement s = null;
    ResultSet rs = null;

    try {
        s = con.createStatement();
        rs = s.executeQuery("SELECT * FROM MY_TABLE;");

        // Some long process that takes a while....
        // But this time we don't care that this will take time,  
        // since nobody is waiting for us to release the connection


    catch(Exception e) {
        throw new Exception(e.getMessage())
    } finally {
        s.close();
        rs.close();
    }
}

明らかに、ステートメントと結果セットはメソッドが終了するまで開いたままになりますが、これは接続自体には影響しないため、この接続を使用する他の試みを妨げません。

私が見逃しているさらなる洞察があると思います。標準が接続プールで機能していることは理解していますが、これらの問題をどのように処理しますか?

4

2 に答える 2