一次访问优化

公司一个业务要用用户的全部保单号访问数据库,获取用户的精彩服务,如图: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");
		}
	}
相关文章
相关标签/搜索