优化页面导出功能

某天运营人员想导出公司的结算数据

等了几千年,最终报错了

然后她去群里召唤我,双方经过激烈的争执

我改,我改还不行吗!!!

1 定位问题

通过 arthas 定位,发现主要慢在部分方法通过 id 单个调用dubbo接口或查询数据库

2 解决方案

(1)通过 id 单个查询改为通过 ids 批量查询数据库

(2)列表串行遍历改为并行流遍历

(3)分批并行组装数据

原来

public List<BillingRecordsDTO> convertToDto(List<BillingRecordsBean> list, boolean isAdmin, Integer announcerType, boolean needPhotoUrl) {
	  
     return this.billingManager.convertToDto(list, isAdmin,announcerType, false);
}

修改后

public List<BillingRecordsDTO> convertToDto(List<BillingRecordsBean> list, boolean isAdmin, Integer announcerType, boolean needPhotoUrl) {
			
     // 1000 条分片
     List<List<BillingRecordsBean>> partitionList = Lists.partition(list, 1000);
     List<BillingRecordsDTO> collect = partitionList
            // 并行流 公共 ForkJoinPool
            .parallelStream()
            // 使用 CompletableFuture 返回结果
            .map(billingRecordsBeanList -> CompletableFuture.supplyAsync(() -> this.billingManager.convertToDto(billingRecordsBeanList, isAdmin,announcerType, false)))
            // 获取结果
            .map(CompletableFuture::join)
            // List<List> 转为 流
            .flatMap(List::stream)
            .collect(Collectors.toList());
      return collect;  
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

相关推荐
©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页