PoolingClientConnectionManager PoolStats和潜在的连接泄漏问题

时间:2013-09-06 17:51:48

标签: connection-pooling apache-httpclient-4.x connection-leaks

我正在使用PoolingClientConnectionManager,我怀疑我正在泄漏连接。我有一个监视线程打印出PoolStats,如下所示:

[leased: 126; pending: 0; available: 14; max: 140]
..
[leased: 140; pending: 20; available: 0; max: 140]
..
[leased: 140; pending: 10; available: 0; max: 140]

我将相同数量的线程产生到池连接数(140),所以我从未期待租用+待定>最大。这个假设有效吗?或者这是经理保持活力的情况?我不确定这种情况是否将连接归因于“租赁”或“可用”。

我注意到,如果在DNS解析期间HttpClient连接中断,则可能会发生连接泄漏。在这种情况下,租用的连接不会释放回池中。是否有建议的方法来取消分配适当的资源,以便将连接正确地释放回池中?

提前致谢。

1 个答案:

答案 0 :(得分:0)

是的,似乎很可能存在连接泄漏。虽然DNS查找不太可能导致它。 HttpClient应该在i / o,协议或运行时异常的情况下自动释放连接。

就资源释放而言,规则应该相当简单:只要有与响应关联的实体,就必须确保其内容被完全消耗。在特殊情况下,HttpClient 4.2和HttpClient 4.3还为资源释放提供了额外的安全保护:4.2中的HttpUriRequest#releaseConnection4.3中的CloseableHttpResponse#close

您还可以尝试运行启用了连接管理上下文日志记录的应用程序,如here所述,并查看是否可以帮助您跟踪永不释放基础连接的请求。