4

用于持久连接的 Java HTTP 连接池在 http://download.oracle.com/javase/6/docs/technotes/guides/net/http-keepalive.html中进行了描述。但是,如果连接不被重用,则没有迹象表明连接是否会从缓存中逐出,如果是,超时长度是多少。

我发现的唯一参考是来自http://www.java.net/forum/topic/performance/general-performance-discussion/reusing-socket-connections-httpurlconnection-0的以下评论:

“保持活动套接字会超时。如果服务器在 HTTP 标头中发回超时,则使用该超时值。否则,超时仅为 5 秒,之后套接字将不会被重用 [.. .] 不幸的是,你不能设置超时;它在实现的内部是硬件化的。”

如果属实,这将解释我们看到的一些奇怪行为,我写了一个小测试用例似乎证实了这一点。(在 Windows 上使用 Java 1.6.20。)

有谁知道这方面的任何文件?此外,该评论已有数年历史。超时仍然是硬编码的,还是可以设置?

4

1 回答 1

1

听起来很合乎逻辑。网络属性的文档(您可以通过主 API 设置的文档除外)在这里。AFAICT 您唯一可以设置的是是否使用保持活动以及连接多少个连接池。

在 Java 7 中,它们显然只在启动时检查。在 java 6 文档中没有说明这种影响,但我认为那一定是文档疏忽。因此,原则上,要关闭 keepalive,您必须在命令行上将其传递为:

java -Dhttp.keepalive=false ...

或者使每个主机的池更小:

java -Dhttp.maxConnections=1 ...

您也可以尝试使用,System.setProperty()但据说这行不通。

知道这会导致什么问题会很有趣,也许在某处可以找到解决方案?

于 2011-02-16T17:45:39.667 回答