一次访问优化

公司一个业务要用用户的所有保单号访问数据库,获取用户的精彩服务,如图:

dbee31736145de7c6d103f13a29759a3211.jpg

问题:先不要说街客,内部的测试都过不了,因为测试账号有200几张保单,页面发出request,往往timeout也等不来

解决:

1、首先识别目标保单,保单里面有属性,根据属性识别出本次真正要调用的保单,

     不再和以前那样一股脑扔到后端系统查询,

     这里少了100多张保单,还剩103张。

2、原来访问后端系统是逐个扔保单号到后端系统;虽然是内网,但极为耗时,

     这里改为一次传一个arraylist到后端,里面包含103张保单,减少对后端网络的访问。

     这里原来103次访问变为1次访问。

3、保单传到后端后,原来是同步查询数据库103次,这里采用CyclicBarrier多线程,结果汇总后返回。

到这里原来要几分钟的程序,优化为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");
		}
	}

  

     

     

 

转载于:https://my.oschina.net/u/2277088/blog/3028111

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值