gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:00:28 25 4
gpt4 key购买 nike

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

Javadocs 似乎有点模糊 - 关于 URLConnection:

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

在 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();

最佳答案

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

关于java - 如何在高使用率的多线程环境中以最佳方式清理传出的 UrlConnection 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1289688/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com