一次訪問優化

公司一個業務要用用戶的全部保單號訪問數據庫,獲取用戶的精彩服務,如圖: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");
		}
	}
相關文章
相關標籤/搜索