我们有一个Java Web应用程序,它在收到请求后立即从HttpServlet中的Hikari连接池(版本3.2.0)获取连接,并在返回响应时将其关闭。
我们设置了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秒),或者根本无法回答。
此操作(以及servlet上的高流量)导致池已满,因此我们开始收到Connection leak detection
警告,一旦没有更多的空闲连接,该消息就会抛出SQLTransientConnectionException
:Connection is not available, request timed out after 30000ms
。
这是Hikari的预期行为,完全可以。
我的问题是:如何处理这种情况?除了截获泄漏的连接并关闭它们之外,还有其他解决方案吗?