ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

关于“导出”,数据量大,速度慢做的优化

2020-10-26 15:35:02  阅读:277  来源: 互联网

标签:Exception excelMapper pageSize 导出 list 速度慢 base 数据量 new


@RequestMapping("/exportProduct")
public void exportProduct(ProductQueryDTO productQueryDTO,HttpServletRequest request, HttpServletResponse response) throws Exception{
//只有管理员才能导出数据
User user = LoginUtil.getUserInfo();
Integer roleType = user.getRoleType();
if(GlobalConstant.SEVEN != roleType){
return;
}
Set<String> excludeColumnFiledNames = new HashSet<String>(ValidationUtil.getHashMapValue(16));
multiThreadExcelExport.exportExcel("商品", response, productSkuMapper, productQueryDTO, ExportProductDTO.class,excludeColumnFiledNames);
}


/** service
* 导出
* @param name 导出名字
* @param response 导出流
* @param excelMapper 导出的顶级父类
* @param base 查询的顶级父类
* @param head 导出的实体类
* @throws Exception
*/
@SuppressWarnings("unchecked")
public void exportExcel(String name,HttpServletResponse response,ExcelMapper excelMapper, Base base,Class head, Set<String> excludeColumnFiledNames) throws Exception{
String fileName = name+fastDateFormat.format(new Date());
ExcelWriter writer = EasyExcel.write(getOutputStream(fileName,response),head).excludeColumnFiledNames(excludeColumnFiledNames).registerWriteHandler(myHorizontalCellStyleStrategy()).build();
WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").registerWriteHandler(new EasyExcelColumnWidthConfig()).build();
// 根据数据读写速度来调整,一般来说读的逻辑复杂,比较慢,如果读比写快,这里设为1

  // 查询总条数
Long count=excelMapper.excelListCount(base);
Long total=count>50000?50000:count;
// 分页大小可以适当调整
int pageSize = 5000;
Long pageCount = total % pageSize == 0 ? (total / pageSize) : (total / pageSize + 1);
int BlockingQueueSize=pageCount.intValue()==0?1:pageCount.intValue();
// 大小设置为2就可以,作为缓冲
BlockingQueue<List<T>> queue = new ArrayBlockingQueue<>(BlockingQueueSize);
AtomicInteger start = new AtomicInteger(0);
AtomicInteger writerCount = new AtomicInteger(0);
ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat("excel-pool-%d").build();
//线程池
ExecutorService executorService=new ThreadPoolExecutor(30 , 50 ,
1, TimeUnit.MINUTES, new LinkedBlockingQueue<>(100), threadFactory);
//开启多个线程分页查数据

executorService.submit(() -> {
while (start.get()<=total) {
//自增
int pageNum = start.getAndAdd(pageSize);
try {
List<T> list = findPage(pageNum, pageSize,excelMapper,base);
if (CollectionUtils.isEmpty(list)) {
break;
}
queue.put(list);
} catch (Exception e) {
//异常情况也要放入空集合,防止写线程无法退出循环
log.error("异常情况",e);
}
}
});
Future<?> submit = executorService.submit(() -> {
while (writerCount.get()<total) {
List<T> list = null;
try{
list = queue.take();
writerCount.getAndAdd(list.size());
writer.write(list, writeSheet);
}catch (InterruptedException e){
}

}
try{
writer.finish();
}catch (Exception e) {
log.error("异常情况",e);
System.out.println("6666");
}finally {
executorService.shutdown();
}
});
try {
// 阻塞等待完成,异步处理也可以去掉这段代码
submit.get();
} catch (Exception e) {
throw new RuntimeException(e);
}finally {
executorService.shutdown();
}
}

private List<T> findPage(int pageNum, int pageSize, ExcelMapper excelMapper,Base base) {
// todo 实现分页查询
base.setPage(pageNum);
base.setPageSize(pageSize);
List<T> list=excelMapper.excelList(base);
return list;
}

标签:Exception,excelMapper,pageSize,导出,list,速度慢,base,数据量,new
来源: https://www.cnblogs.com/zhudingsheng/p/13878715.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有