Пул соединений Java и операторы try-with: действительно ли соединение закрыто или возвращено в пул?

У меня есть пул соединений jdbc, использующий класс KeyedObjectPool, и я использую его с помощью реализованных методов openConnection() и closeConnection(). closeConnection() обычно просто возвращает соединение с пулом и закрывает его только в том случае, если оно часто использовалось ранее. Поэтому он использует ConnectionPool.returnObject(), который НЕ закрывает объект подключения (см. здесь).

class ConnectionPool
{

public openConnection(...)
{
   ...
}

public closeConnection()
{
   ...
}
}

Однако, если я использую пул соединений следующим образом:

    try (Connection connection = sConnectionPool.openConnection(JdbcCredentials);)
    {
        doSomething();
    }
    catch (Exception e) 
    {
       ...
    }

Является ли объект подключения, использующий try-with, только возвращенным в пул или фактически закрытым с помощью connection.close() (чего я не хочу, потому что это сделает мой пул бесполезным)?




Ответы (2)


На самом деле это оболочка вокруг фактического соединения. Он под прикрытием освободит фактическое соединение обратно в пул. Далее пул должен решить, будет ли фактическое соединение фактически закрыто или будет повторно использоваться для нового getConnection().

person saurabh2208    schedule 15.09.2017
comment
Я попробовал свое приложение, и оно, похоже, не работает. Как JVM узнает, что мое соединение взято из пула соединений и что оно должно использовать closeConnection() вместо connection.close()? - person flixe; 20.09.2017

close() в соединении из пула возвращает его в пул, независимо от того, было ли это вызвано try или вашим собственным кодом.

В противном случае его нельзя было бы использовать повторно, поэтому он не был бы пулом соединений.

person user207421    schedule 15.09.2017
comment
@downvoter Скажи, пожалуйста. Закрытое соединение можно использовать повторно? Как? - person user207421; 15.09.2017
comment
Вы неправильно поняли вопрос. Это не ответ. - person teppic; 15.09.2017
comment
@teppic try вызывает close(), а close() возвращает его в пул, о чем спрашивает OP. - person user207421; 15.09.2017
comment
@teppic OP теперь принял ответ, в котором говорится то же самое. - person user207421; 17.09.2017