Жизненный цикл подключения JDBC для повторного использования пула подключений (Hikari)

Хикари: 2.4.7

Драйвер PostgreSQL JDBC: 9.4-1201-jdbc41

Я пытаюсь понять, что нужно сделать с объектом java.sql.Connection, чтобы он снова стал доступен в пуле соединений?

Я только что представил пул соединений для многопоточного приложения, которое ранее устанавливало / разрывало соединения с каждым оператором SQL.

После знакомства с Хикари я заметил, что как только я нажимаю maximumPoolSize, каждая последующая попытка HikariDataSource.getConnection будет терпеть неудачу из-за connectionTimeout. Так что, похоже, я каким-то образом не «освобождаю» эту связь.

Типичное использование объекта Connection:

# omits Exception handling, parameter substitution, result evaluation. 
PreparedStatement preparedStatement = hikariDataSource.getConnection().prepareStatement(sql);
preparedStatement.executeQuery();
preparedStatement.close();

Ожидается ли что-нибудь еще, что нужно сделать с этим соединением, чтобы его можно было повторно использовать в пуле соединений?

Autocommit горит. Connection.close(), если не делать чего-то особенного, предоставленного Хикари, казалось, как раз то, чего я хотел избежать.


person markdsievers    schedule 30.08.2016    source источник


Ответы (1)


Я не знаю конкретно Hikari, но для каждого соединения, которое вы извлекаете из пула соединений, вы должны вернуть это соединение, когда закончите с ним.

Обычно это делается с помощью Connection.close() - пул передает функцию-оболочку, где close() физически не закрывает соединение, а только возвращает его.

Итак, ваш код должен выглядеть так:

Connection con = hikariDataSource.getConnection();
PreparedStatement preparedStatement = con.prepareStatement(sql);
preparedStatement.executeQuery();
preparedStatement.close();
con.close(); // this returns the connection to the pool

Конечно, два close() метода должны вызываться в блоке finally.

person a_horse_with_no_name    schedule 30.08.2016
comment
Спасибо за быстрый ответ. Ознакомился с источник и похоже, что ваше утверждение верно - я вижу, как происходит повторное использование в Connection.close и PoolEntry.recycle(). Дадим ему трещину и вернемся с положительными голосами и зелеными галочками. - person markdsievers; 31.08.2016
comment
Или лучше: используйте try-with-resources - person Mark Rotteveel; 31.08.2016