2016-08-30 3 views
1

Хикари: 2.4.7Жизненный цикл соединения JDBC для пула соединений (Хикари) повторное

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(), если не делать что-то особенное, если оно представлено Хикари, похоже на то, чего я хотел избежать.

ответ

4

Я не знаю 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 блоке.

+0

Спасибо за быстрый ответ. Выбрал [источник] (https://github.com/brettwooldridge/HikariCP/blob/dev/src/main/java/com/zaxxer/hikari/pool/ProxyConnection.java#L228) и выглядит так: ваше утверждение on - Я вижу поведение рециркуляции, происходящее в 'Connection.close' и' PoolEntry.recycle() '. Отдаст ему трещину и вернется с первыми и зелеными клещами. – markdsievers

+0

Или лучше: используйте try-with-resources –

Смежные вопросы