在 Java 里“HTTP 连接池”通常指 复用 TCP 连接,避免每次请求都新建连接。常见方案有:
下面分别给你最常用、可直接抄的代码。
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.14</version>
</dependency>
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
public class HttpPoolUtil {
public static CloseableHttpClient createClient() {
PoolingHttpClientConnectionManager cm =
new PoolingHttpClientConnectionManager();
// 总连接数
cm.setMaxTotal(200);
// 每个路由(host)最大连接数
cm.setDefaultMaxPerRoute(50);
return HttpClients.custom()
.setConnectionManager(cm)
.build();
}
}
CloseableHttpClient client = HttpPoolUtil.createClient();
HttpGet get = new HttpGet("https://example.com");
try (CloseableHttpResponse response = client.execute(get)) {
System.out.println(response.getStatusLine());
}
✅ 连接会被复用,不会每次新建 TCP
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.12.0</version>
</dependency>
OkHttpClient client = new OkHttpClient.Builder()
.connectionPool(
new ConnectionPool(50, 5, TimeUnit.MINUTES)
)
.build();
Request request = new Request.Builder()
.url("https://example.com")
.build();
try (Response response = client.newCall(request).execute()) {
System.out.println(response.code());
}
✅ OkHttp 默认就有连接池
HttpClient client = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_2)
.build();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com"))
.build();
HttpResponse<String> response =
client.send(request, HttpResponse.BodyHandlers.ofString());
✅ 内部自动复用连接
@Bean
public RestTemplate restTemplate() {
return new RestTemplate(
new HttpComponentsClientHttpRequestFactory(
HttpPoolUtil.createClient()
)
);
}
WebClient client = WebClient.builder()
.clientConnector(
new ReactorClientHttpConnector(
HttpClient.create().responseTimeout(Duration.ofSeconds(5))
)
)
.build();
| 参数 | 说明 |
|---|---|
| maxTotal | 总连接数 |
| maxPerRoute | 单个域名最大连接 |
| keepAlive | 连接存活时间 |
| timeout | 连接/读取超时 |
❌ 每次 new HttpClient()(无池)
❌ 忘记关闭 response
❌ 连接数太小导致阻塞
❌ 高并发下没设置 maxPerRoute
如果你告诉我:
我可以直接帮你写一套 生产级连接池配置。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。