2

我有一个用例,其中一个 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();
4

2 回答 2

5

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

于 2009-08-17T21:23:25.923 回答
1

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

于 2009-08-17T19:20:36.030 回答