1

从本文档中可以看出,在使用URLConnection时,在 Java 中 TCP 连接池“工作”之前必须满足一些先决条件。如何确定连接是否正在池中?我可以在 sun jdk 中为此检查任何对象吗?

4

2 回答 2

1

对于 Sun JDK 5 中包含的 Sun 的 HTTP 协议处理程序,您可以检查 class sun.net.www.http.HttpClient。该成员KeepAliveCache kac持有持久连接。如果您的连接在 HashTable 中,它将被重用。

根据您的使用模式,HTTP 处理程序中的 Keepalive 支持可能会出现问题。当连接停留在缓存中时,没有线程响应状态更改,因此连接变得陈旧。重新使用时,您可能会得到 IOException。所以我们通常禁用keepalive。

如果你真的需要池连接,更好的选择是带有池化多线程连接管理器的 Apache HttpClient。

于 2009-08-21T14:02:08.030 回答
1

这并不是真正的连接池,而是本文档讨论的 HTTP 保持活动机制。如果您可以以任何方式检查网络流量,那么检测这种情况的一种简单方法是检查请求。如果它使用的是 HTTP/1.1 并且没有“Connection: close”,或者它使用的是 HTTP/1.0 并且您确实看到了“Connection: Keep-Alive”,那么就请求而言它正在工作。

否则,它几乎是一个实现细节。您可以使用调试器检查实现的内部状态,看看它是否似乎有一些启用保持活动的字段集。您需要查看源代码。

您的文档还建议您查看 System.getProperty("http.keepAlive")。如果它为 null 或“true”,那么似乎启用了 keep-alive。

于 2009-08-21T12:46:22.523 回答