У нас есть веб-приложение на 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
.
Это ожидаемая форма поведенияХикари, и все в порядке.
Мой вопрос: как мы можем справиться с этой ситуацией?Существуют ли другие решения, кроме как перехватить просочившиеся соединения и закрыть их?