业务场景:查询当前登录人待审批,已审批,未提交的个数。
因为每个状态所涉及的查询逻辑是不一样的,如果用一个线程串行去跑,需要执行至少3个sql,但实际上有7,8个sql,串行执行返回时长大概需要800ms左右。
优化:利用CompletableFuture并行去查询,对结果进行归集
public class Result{
private Integer unCommit;
private Integer waitApprove;
private Integer alreadyApprove;
}
public Result computeRes(QueryCondition query){
Result res = new Result();
//未提交
CompletableFuture<Void> unCommitFuture = CompletableFuture.supplyAsync(() ->
queryUnCommit(query)).thenAccept(res::setUnCommit);
//待审核
CompletableFuture<Void> waitApprovalFuture = CompletableFuture.supplyAsync(() ->
queryWaitApprove(query)).thenAccept(res::setWaitApprove);
//已审核
CompletableFuture<Void> alreadyApprovalFuture = CompletableFuture.supplyAsync(() ->
queryAlreadyApprove(query)).thenAccept(res::setAlreadyApprove);
CompletableFuture.allOf(unCommitFuture,waitApprovalFuture,alreadyApprovalFuture).join();
return res;
}
优化过后,响应时长300ms左右。