这段代码对您来说还不错吗?
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答案(后1 , 2 , 3 , 4 ),并且还对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