首页 > 解决方案 > 泄漏时如何管理 HikariCP 连接?

问题描述

我们有一个 Java Web 应用程序,它在收到请求后立即从 HttpServlet 中的 Hikari 连接池(版本 3.2.0)获取连接,并在返回响应时关闭它。我们设置leakDetectionThresholdconnectionTimeout以便我们可以识别泄漏的连接。

“伪代码”中,它看起来像这样:

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 秒),或者我们根本没有得到任何回答。

这(以及 servlet 上的高流量)导致池被填满,因此我们开始收到Connection leak detection警告,一旦没有更多空闲连接,SQLTransientConnectionException就会抛出以下消息:Connection is not available, request timed out after 30000ms.

这是 Hikari 的预期行为,完全没问题。

我的问题是:我们该如何处理这种情况?除了拦截泄漏的连接并关闭它们之外,还有其他解决方案吗?

标签: javaservletsdatabase-connectionconnection-poolinghikaricp

解决方案


推荐阅读