公司一個業務要用用戶的全部保單號訪問數據庫,獲取用戶的精彩服務,如圖:java
問題:先不要說街客,內部的測試都過不了,由於測試帳號有200幾張保單,頁面發出request,每每timeout也等不來數據庫
解決:後端
一、首先識別目標保單,保單裏面有屬性,根據屬性識別出本次真正要調用的保單,網絡
再也不和之前那樣一股腦扔到後端系統查詢,多線程
這裏少了100多張保單,還剩103張。併發
二、原來訪問後端系統是逐個扔保單號到後端系統;雖然是內網,但極爲耗時,ide
這裏改成一次傳一個arraylist到後端,裏面包含103張保單,減小對後端網絡的訪問。測試
這裏原來103次訪問變爲1次訪問。優化
三、保單傳到後端後,原來是同步查詢數據庫103次,這裏採用CyclicBarrier多線程,結果彙總後返回。this
到這裏原來要幾分鐘的程序,優化爲5-10s
看日誌,裏面這段保單查詢的代碼僅3s, 其餘耗時是其餘訪問形成的。
Map<String, ArrayList<BankInsuranceInfo>> wonderListBankInsuranceInfo = new HashMap<String, ArrayList<BankInsuranceInfo>>(); CyclicBarrier cb = new CyclicBarrier(useSize + 1); try { logger.info("經過保單號獲取精彩服務列表信息方法參數: 執行開始!!!!"); for (int i = 0; i < useSize; i++) { ArrayList<BankInsuranceInfo> BankInsuranceInfoList = new ArrayList<BankInsuranceInfo>(); new Thread(new WonderListThread(policynoList.get(i).toString().trim(),BankInsuranceInfoList,cb,WonderfulServerService)).start(); wonderListBankInsuranceInfo.put(policynoList.get(i).toString().trim(), BankInsuranceInfoList); } cb.await(); logger.info("經過保單號獲取精彩服務列表信息方法參數: 執行結束!!!!"); logger.info("經過保單號獲取精彩服務列表信息方法參數: 彙總開始!!!!"); for(String policyno : policynoList){ if(null != wonderListBankInsuranceInfo.get(policyno) && wonderListBankInsuranceInfo.get(policyno).size()!=0){ itemInfos.addAll(wonderListBankInsuranceInfo.get(policyno)); //總的精彩服務表,未去重 } } } catch (InterruptedException | BrokenBarrierException e) { logger.info("經過保單號獲取精彩服務列表信息方法出錯!"); e.printStackTrace(); } /** * 經過線程併發獲取保單的精彩服務 * TODO * @return * @描述: 簡要說明 */ private class WonderListThread implements Runnable { private String policyno; private List<BankInsuranceInfo> policyBankInsuranceInfo; CyclicBarrier cb; WonderfulServerService WonderfulServerService; public WonderListThread(String policyno, List<BankInsuranceInfo> policyBankInsuranceInfo,CyclicBarrier cb, WonderfulServerService WonderfulServerService){ this.policyno = policyno; this.policyBankInsuranceInfo = policyBankInsuranceInfo; this.cb=cb; this.WonderfulServerService = WonderfulServerService; } @Override public void run() { long startTime = System.currentTimeMillis(); String logStr = "[Thread " + Thread.currentThread().getId()+ "]"; logger.info(logStr + " start"); logger.info(logStr+"本次執行的保單號:"+policyno); try { Map<String, Object> wonderfulList = WonderfulServerService.wonderListByChdrnum(policyno); if("success".equals(String.valueOf(wonderfulList.get("state")))) { policyBankInsuranceInfo.addAll((List<BankInsuranceInfo>)wonderfulList.get("data")); //總的精彩服務表,未去重 } logger.info(logStr+"本次執行的保單號:"+policyno+"已經獲取精彩服務,正在等候其它線程完成..."); cb.await(); } catch (Exception e) { logger.info(logStr + " error 出現異常"); logger.info(logStr+"本次執行的保單號:"+policyno); e.printStackTrace(); logger.error("異常", e); logger.error(e.getLocalizedMessage(), e); } long endTime = System.currentTimeMillis(); logger.info(logStr+"健康管理獲取保單的精彩服務,保單號"+policyno+"共花銷:"+(endTime-startTime)+" ms"); logger.info(logStr+" end"); } }