dataSourcePool закрыть прерванное соединение при выпуске в пул


Я использую пул соединений Hikari jdbc.

Когда инструкция execute witch производит исключение (например по сети разбивается). следующим образом:

try{
   Connection con = pool.getConnection();
   con.executeQuery("....");
}catch(Exception e){
   con.close();
}

Делает con.close будет выселять разорванное соединение, вместо того, чтобы освободить его в пул.

Если разорванное соединение отпущено в пул. он может быть получен следующим запросом getConnection.

4 2

4 ответа:

Если ваш драйвер совместим с JDBC4 (и поддерживает Connection.isValid()), проверка соединения выполняется через этот API по умолчанию).

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

Смотрите такжеэто Обсуждение иисходный код.

Используйте con. close в блоке finally, иначе в блоке catch вы должны сначала спросить, если con != null для исключения исключения, созданного в блоке catch. Другие alernative можно заключить, кон.close() в других попробовать{}поймать{} блок. Надеюсь, это поможет.

Вы должны рассмотреть try-with-resource:

try(Connection con = pool.getConnection()) {
  DO SOMETHING WITH CONNECTION
}catch(Exception e){
   e.printStackTrace();
}

Это будет гарантировать, что соединение будет возвращено в пул. Проверка правильности соединения является задачей для пула , а не для вашего кода. Вы можете настроить пул для проверки вашего соединения с помощью свойстваconnectionTestQuery - Вот и все.

Если вы используете try-with-resource И если сеть нарушена, HikariCP, скорее всего, закроет соединение, а не переработает. из источника HikariCP, если есть такое исключение в связи.close (), это закрытие соединения в checkException ()