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