处理业务逻辑时,难免会遇到调用几个mapper层接口获取数据进行处理,如果遇到处理方法耗时大且这几个方法没有关联的,可以尝试使用线程池对接口进行优化。
优化接口实战
sevice层:
业务需要统计三个参数的值,分别调用三个mapper方法获取数据,比如数据量大,每个方法耗时5秒,按程序串联执行,这需要15秒完成操作。
//耗时6秒
Map<String, Object> user = statMapper.getUser(wallet);
//耗时5秒
Map<String, Object> amount = statMapper.getAmount(wallet);
//耗时4秒
Map<String, Object> allLog = statMapper.getLog(wallet);
for (String key : user .keySet()) {
activity.setUser((Long) user.get(key));
}
for (String key : amount .keySet()) {
activity.setAmount((BigDecimal) amount.get(key));
}
for (String key : allLog .keySet()) {
activity.getLog((Long) allLog .get(key));
}
以上串行处理完程序需要6+5+4=15秒,现在改用线程池来优化接口,使这几个接口异步进行:
//创建线程池,默认值赋予3
ExecutorService executorService = Executors.newFixedThreadPool(3);
//创建CompletionService接口的实现类,用来处理异步的线程,并且接收返回的结果
CompletionService completionService = new ExecutorCompletionService<Object>(executorService);
//耗时6秒
completionService.submit(() -> statMapper.getUser(wallet));
//耗时5秒
completionService.submit(() -> statMapper.getAmount(wallet));
//耗时4秒
completionService.submit(() -> statMapper.getLog(wallet));
executorService.shutdown();
for (int i = 0; i < 3; i++) {
//阻塞式获取线程执行完毕的结果
Map<String, Object> map = (Map<String, Object>) completionService.take().get();
for (String key : map.keySet()) {
switch (key) {
case "user":
activity.setUser((Long) map.get(key));
break;
case "amount":
activity.setAmount((BigDecimal) map.get(key));
break;
case "allLog":
activity.setLog((Long) map.get(key));
break;
}
}
}
由于程序异步执行,所以只用时6秒就可以完成操作。