Как управлять соединениями 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,

Это поведение, ожидаемое от Хикари, и оно совершенно нормально.

Мой вопрос: как мы можем справиться с этой ситуацией? Существуют ли другие решения, кроме как перехватить просочившиеся соединения и закрыть их?

0 ответов

Другие вопросы по тегам