HttpURLConnection的警告

这段代码对您来说还不错吗?

HttpURLConnection connection = null;
try {
   connection = (HttpURLConnection) url.openConnection();
   try (InputStream in = url.getInputStream()) {
     return streamToString(in);
   }
} finally {
   if (connection != null) connection.disconnect();
}

看起来不错–它打开一个连接,从中读取,关闭输入流,释放连接,仅此而已。 但是,在运行一些性能测试并试图找出瓶颈问题时,我们发现disconnect()看起来并不那么好–当我们停止断开连接时,传出连接的数量是原来的两倍。 这是javadoc:

表示在不久的将来不太可能向服务器发出其他请求。 调用disconnect()并不意味着可以将此HttpURLConnection实例重新用于其他请求。

在类itslef上:

如果持久连接当时处于空闲状态,则调用disconnect()方法可能会关闭基础套接字。

这仍然不清楚,但是给我们一个暗示,还有更多的东西。 读取几个计算器的和java.net答案(后1234 ),并且还对Android文档相同的类,它是从Oracle实现实际上不同的,事实证明, .disconnect()实际关闭(或在Android的情况下可能会关闭)基础套接字。

然后,我们可以找到这部分文档 (它在javadoc中进行了链接,但是在调用断开连接时并没有立即变得很重要),这为我们提供了全貌:

keep.alive属性(默认值:true)指示套接字可以被后续请求重用。 通过打开与服务器的连接(支持保持活动状态)来工作,然后不再需要打开套接字的开销。 默认情况下,最多重复使用5个此类套接字(每个目标)。 您可以通过设置http.maxConnections属性来增加此池的大小。 但是,将其增加到10、20和50之后,传出请求的数量没有明显改善。

但是,当我们使用池化连接管理器从HttpURLConnection切换到apache http client时 ,每秒发出的连接数量增加了3倍。 而这并没有对其进行微调。

负载测试,即用尽可能多的请求轰炸目标服务器,听起来像一个小众的用例。 但是实际上,如果您的应用程序在每个请求中调用了堆栈中的Web服务或外部服务,那么您将遇到相同的问题–您每秒可以向目标服务器发出更少的请求,因此,每秒响应您的用户的请求更少。

这里的建议是:几乎总是喜欢apache http客户端 –它具有更好的API方式和更好的性能,而无需了解其在下面的功能。 但也要注意同样的注意事项–检查池大小连接重用 。 如果使用HttpURLConnection ,请在阅读连接响应后不要断开连接,请考虑增加套接字池的大小,并注意相关问题

翻译自: https://www.javacodegeeks.com/2014/09/caveats-of-httpurlconnection.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值