Как управлять соединениями HikariCP при их утечке?
У нас есть веб-приложение на Java, которое получает соединение из пула соединений Hikari (версия 3.2.0) в HttpServlet, как только оно получает запрос и закрывает его при возврате ответа. Мы устанавливаем leakDetectionThreshold
и connectionTimeout
так что мы можем определить соединения, которые просочились.
В "псевдокоде" это выглядит так:
public class MyServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) {
try {
Connection connection = dataSource.getConnection();
String htmlResponse = doStuff(request, connection);
response.write(htmlResponse);
} catch (Exception exception) {
//handle exception
} finally {
connection.close();
}
}
private String doStuff(HttpServletRequest request, Connection connection) {
//...
}
}
В doStuff
мы вызываем внешнюю службу для получения некоторых данных, и иногда для ответа требуется много времени (>30 секунд), или мы вообще не получаем ответа.
Это (и высокий трафик сервлета) заставляет пул заполняться, и поэтому мы начинаем получать Connection leak detection
предупреждение и, когда больше нет свободных соединений SQLTransientConnectionException
выбрасывается с этим сообщением: Connection is not available, request timed out after 30000ms
,
Это поведение, ожидаемое от Хикари, и оно совершенно нормально.
Мой вопрос: как мы можем справиться с этой ситуацией? Существуют ли другие решения, кроме как перехватить просочившиеся соединения и закрыть их?