高并发下restTemplate的错误分析
1. 问题现象和分析
org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection
此问题很明显是连接等待超时,而且是从连接池中获取的连接。
那么就有一个很诧异的问题,这里哪来的连接池呢?然后我去跟踪restTemplate的源码发现,其底层是通过apache 的httpClient实现了连接池。那么问题就很明显了。就是在并发量高的时候,可能会出现连接池不够用。
2. 问题解决
- 既然分析出来是连接池不够了,那么我们在构建restTemplate的时候配置其底层的httpClient连接池大小,以便提高高并发的时候RestTemplate的性能。
- 可以通过配置总体最大连接池(maxConnTotal)和单个路由连接最大数(maxConnPerRoute),默认是(20,2)
maxConnTotal 是整个连接池的大小,根据自己的业务需求进行设置
maxConnPerR