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