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

时间:2009-08-17 18:43:48

标签: java httpurlconnection urlconnection

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

Javadocs看起来有点模糊 - 关于URLConnection:

'在请求之后调用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 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

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