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