公司一个业务要用用户的所有保单号访问数据库,获取用户的精彩服务,如图:
问题:先不要说街客,内部的测试都过不了,因为测试账号有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");
}
}