首页 文章

如何在高使用率的多线程环境中最佳地清理传出的UrlConnection对象?

提问于
浏览
2

我有一个用例,其中一个servlet(具有相当高的并发使用)使得传出的URLConnection检索一些数据REST样式作为其正常的服务器端处理逻辑的一部分 . 每次调用servlet时都会创建并使用该连接,因为URL可能不同(但域始终相同) . 我希望确保尽可能优化地执行此操作,以便端口和连接的打开时间不会超过应用程序服务器上的时间,但如果适用,则会重新使用 .

在URLConnection上,Javadocs看起来有点模糊:

'在请求之后调用URLConnection的InputStream或OutputStream上的close()方法可以释放与此实例关联的网络资源,除非特定协议规范为其指定不同的行为 .

在HttpURLConnection上:

'每个HttpURLConnection实例用于发出单个请求,但与HTTP服务器的基础网络连接可以由其他实例透明地共享 . 在请求之后调用HttpURLConnection的InputStream或OutputStream上的close()方法可以释放与此实例关联的网络资源,但不会影响任何共享持久连接 . 如果持久连接在那时处于空闲状态,则调用disconnect()方法可能会关闭底层套接字 .

目前,正在使用URLConnection并且输入流仅按照以下代码关闭(错误处理和URL读取被删除,因为它们与问题无关) . 我的想法是这将清理流资源,但允许重用底层套接字(因为请求总是在同一个域,具有不同的URL路径) . 有关如何进一步优化的任何建议将不胜感激 .

URL requestUrl = new URL(location);
URLConnection urlConnection = requestUrl.openConnection();
BufferedReader br = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "UTF-8"));
//reading code here
  br.close();

2 回答

  • 1

    我认为你拥有的东西与使用Java的实现一样好 . 如果速度是一个巨大的问题并且Java的实现占用内存或者速度太慢,那么编写自己的连接类 .

  • 5

    您可以考虑使用Apache的HttpClient . 我们在一个发送请求的应用程序中使用它,实际上,每天有几百万次负载在少数几个系统上进行 balancer . 我们已经使用了一个HttpClient对象池,我不确定是否有必要,因为我们不会在调用之间保持连接打开,但代码早于我的时间,也许他们找到了它的原因 .

相关问题