温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java HTTP连接池怎么用

发布时间:2026-10-01 12:32:17 来源:亿速云 阅读:85 作者:小樊 栏目:编程语言

在 Java 里“HTTP 连接池”通常指 复用 TCP 连接,避免每次请求都新建连接。常见方案有:

  1. Apache HttpClient(最常用)
  2. OkHttp(自带连接池)
  3. Spring RestTemplate / WebClient(底层也是连接池)
  4. Java 11+ HttpClient(自带连接池)

下面分别给你最常用、可直接抄的代码。


一、Apache HttpClient(推荐,最经典)

1️⃣ 引入依赖(Maven)

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.14</version>
</dependency>

2️⃣ 创建带连接池的 HttpClient

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

3️⃣ 使用连接池发送请求

CloseableHttpClient client = HttpPoolUtil.createClient();

HttpGet get = new HttpGet("https://example.com");
try (CloseableHttpResponse response = client.execute(get)) {
    System.out.println(response.getStatusLine());
}

✅ 连接会被复用,不会每次新建 TCP


二、OkHttp(自带连接池,非常简洁)

依赖

<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 默认就有连接池


三、Java 11+ 自带 HttpClient(轻量)

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

✅ 内部自动复用连接


四、Spring 项目推荐方式

RestTemplate(已稳定)

@Bean
public RestTemplate restTemplate() {
    return new RestTemplate(
        new HttpComponentsClientHttpRequestFactory(
            HttpPoolUtil.createClient()
        )
    );
}

WebClient(响应式,推荐新项目)

WebClient client = WebClient.builder()
        .clientConnector(
            new ReactorClientHttpConnector(
                HttpClient.create().responseTimeout(Duration.ofSeconds(5))
            )
        )
        .build();

五、连接池关键参数说明

参数 说明
maxTotal 总连接数
maxPerRoute 单个域名最大连接
keepAlive 连接存活时间
timeout 连接/读取超时

六、常见坑 ⚠️

❌ 每次 new HttpClient()(无池)
❌ 忘记关闭 response
❌ 连接数太小导致阻塞
❌ 高并发下没设置 maxPerRoute


如果你告诉我:

  • 用的是 Spring / 普通 Java / 微服务
  • HTTP / HTTPS
  • 并发量

我可以直接帮你写一套 生产级连接池配置。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手