【问题标题】:Does Java HTTP connection pool have an eviction time? Can it be set?Java HTTP 连接池有驱逐时间吗?可以设置吗?
【发布时间】:2011-06-28 12:34:15
【问题描述】:

用于持久连接的 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的以下cmets:

"keep alive sockets 会超时。如果服务器在 HTTP 标头中发回超时,则使用该超时值。否则,超时仅为 5 秒,之后该套接字将不会被重用[...] 不幸的是,您无法设置超时;它在实现的内部是硬件化的。”

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

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

【问题讨论】:

  • 说实话,每当我有这样的问题时,我都会去源代码。大部分 Java 库源代码都可以在 src.zip 中找到,如果您想要更深入的内容,您可以通过深入研究 OpenJDK 源代码来获得一个想法。如果他们没有记录语义,那么可以使用源来找出“真正”发生了什么,尽管如果这些假设在以后的版本中发生更改,显然依赖系统的未记录方面可能是危险的。但至少你现在“知道”发生了什么。

标签: java http caching connection persistent


【解决方案1】:

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

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

java -Dhttp.keepalive=false ...

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

java -Dhttp.maxConnections=1 ...

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

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

【讨论】:

  • 它本身不会引起问题。我们刚刚看到我们的应用程序中的 http 持久连接池不适用于某些站点,但对其他站点运行良好。但是,这似乎是我们的应用程序与 5 秒驱逐时间相结合的间接影响。对于某些站点,我们非常快速地发出多个 HTTP 请求,而其他站点则存在延迟。不知道超时,我们认为可能存在网络问题或自动关闭连接。
  • @ghirschhorn 好的,我很确定您看到的是这种行为。如果您需要更多控制,似乎唯一的选择是使用原始套接字,这涉及更多工作。
猜你喜欢
  • 2017-07-15
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
  • 1970-01-01
  • 2017-06-16
  • 1970-01-01
  • 1970-01-01
  • 2014-01-28
相关资源
最近更新 更多