Okhttpclient连接池大小困境

问题描述 投票:1回答:1

我目前正在使用okhttp 3.10.0,我最近发现为每个新请求创建一个新客户端对于拥有自己的连接池的每个客户端都是不利的。

我在servlet中使用okhttp。无论我现在做的是在每个servlet中声明一个静态客户端并在init()方法中初始化它

client = new OkHttpClient.Builder()
              .readTimeout(15000,TimeUnit.MILLISECONDS)
              .retryOnConnectionFailure(false)
              .connectTimeOut(10000,TimeUnit.MILLISECONDS)
              .connectionPool(new ConnectionPool(20,5L,TimeUnit.MINUTES)
              .build();

现在,这里有最大空闲连接的配置,我将其设置为20,空闲超时设置为5分钟。

1)实际的池大小是多少,即池将具有的最大连接数(通过代码查看,我发现它可能是Integer.MAX_VALUE,并且与主机的最大同时连接是默认的64但我不确定) ?

2)这种方法是否足够好。我目前的方法是为每个servlet创建一个客户端。所以我应该有一个单独的类给同一个客户端给我所有的Servlet,在这种情况下我应该为下面的specs.i配置理想的负载我找不到如何配置实际的池大小所以我不知道如果这是可能的话

数字海洋水滴

Ram 2gb

彩色CPU 2

Tomcat最大堆768mb

Nginx并发工人1000

Mysql max ram~800mb

负载我想支持每秒最多500个用户

java okhttp okhttp3
1个回答
4
投票

您应该设置一个应用程序范围的单例。优选地使用像Guice或Spring的依赖注入器,但是静态单例也可以。

你连接了多少个不同的主机名?如果它很多,主机的长尾将不会受益于游泳池。如果它只是几个,那么你的池将跟踪你的peek并发连接。

对于起点,将其设置为与servlet容器中的线程计数匹配。

© www.soinside.com 2019 - 2024. All rights reserved.