httpclient大量请求网络拒绝 Connection pool shut down

1.背景描述

项目中每次400条数据递归网络请求第三方数据,该次递归总的数据量有220000左右,可以算出大概需要550次调用。但是数据跑到13W左右,程序中断。

2.案例分析

①.系统跑了一遍,没有看到任何日志。

分析: 因为是多线程应用,一开始以为是线程池写法有误,导致数据库连接用完,

解决:使用自定义连接池上了一版,并且加上了日志。

②.系统再跑了一遍,发现日志报错

 

 

分析:问题基本上可以定位到时httpclent问题了。

HttpClientBuilder builder = HttpClients.custom();

使用该方式定义了httpcliet,默认使用的是PoolingHttpClientConnectionManager 线程池管理器

默认每个route只允许最多2个connection,总的connection数量不超过20。

 

但是如果请求多了,还是会出现线程不够用的情况。

解决:

第一种方案:

setConnectionManagerShared(true) 如果线程来不及处理,卡在那里复用线程池。

第二种方案:

setMaxTotal(1000); // 连接池最大并发连接数

setDefaultMaxPerRoute(1000);// 设置最大并发数

③.系统又跑了一遍,发现栈溢出

 

 

分析:syncECCustomerByStepPage 方法栈溢出。

解决:

第一种方案:使用Xss设置栈的大小,弊端是需要知道栈有多大才好设置,而且开发环境和测试环境系统资源比较小,可能一下无法满足需求。

第二种方案:重写代码,使用循环代替递归。

 

参考文档:

https://blog.csdn.net/iq105/article/details/75355831

https://www.jianshu.com/p/14c005e9287c

 

 

 

你可能感兴趣的:(java,多线程,性能优化)