代码之家  ›  专栏  ›  技术社区  ›  Peter

如何在高使用率的多线程环境中优化清理传出的URLConnection对象?

  •  2
  • Peter  · 技术社区  · 16 年前

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

    javadocs看起来有点含糊不清-关于urlconnection:

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

    在httpurl连接上:

    '每个httpurlConnection实例都用于发出单个请求,但是到HTTP服务器的基础网络连接可能会被其他实例透明地共享。在请求后对httpurlConnection的inputstream或outputstream调用close()方法可能会释放与此实例关联的网络资源,但不会影响任何共享持久连接。如果持久连接当时处于空闲状态,则调用disconnect()方法可能会关闭基础套接字。

    目前,根据下面的代码(错误处理和URL读取被删除,因为它们与问题无关),正在使用URLConnection,并且仅关闭输入流。我的想法是,这将清理流资源,但如果可能,允许重新使用底层套接字(因为请求总是指向同一个域,具有不同的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 回复  |  直到 13 年前
        1
  •  1
  •   twolfe18    16 年前

    我认为你拥有的东西和使用Java的实现一样好。如果速度是一个巨大的关注点,Java的实现是占用内存或太慢,请编写自己的连接类。

        2
  •  5
  •   Chris Kessel    16 年前

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

    推荐文章