多线程导出

2000万数据量导出200万数据,10个字段,耗时16s.

@Configuration
@Slf4j
public class AsyncTaskPoolConfig {@Value("${async.executor.thread.core_pool_size}")private int corePoolSize;@Value("${async.executor.thread.max_pool_size}")private int maxPoolSize;@Value("${async.executor.thread.queue_capacity}")private int queueCapacity;@Value("${async.executor.thread.name.prefix}")private String namePrefix;@Bean(name = "taskExecutor")public Executor asyncServiceExecutor() {log.warn("start taskExecutor");//在这里修改ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();//配置核心线程数executor.setCorePoolSize(corePoolSize);//配置最大线程数executor.setMaxPoolSize(maxPoolSize);//配置队列大小executor.setQueueCapacity(queueCapacity);//配置线程池中的线程的名称前缀executor.setThreadNamePrefix(namePrefix);// rejection-policy:当pool已经达到max size的时候,如何处理新任务// CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());//执行初始化executor.initialize();return executor;}
}

配置

spring:# DataSource Configdatasource:druid:url: jdbc:mysql://127.0.0.1:3306/maruko?useUnicode=true&characterEncoding=utf-8&useSSL=falseusername: rootpassword: 123456initial-size: 5max-active: 10min-idle: 10max-wait: 20#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒time-between-eviction-runs-millis: 60000
# 异步线程配置
# 配置核心线程数
async:executor:thread:core_pool_size: 10# 配置最大线程数max_pool_size: 20# 配置队列大小queue_capacity: 30# 配置线程池中的线程的名称前缀name:prefix: async-excl-
 @GetMapping(value = "/exportEasyExcel2")public void exportEasyExcel2() {long start = System.currentTimeMillis();// 数据的总数int dataTotalCount = 2000000;int limit = 150000;// 计算出多少页,即循环次数int count = dataTotalCount / limit + (dataTotalCount % limit > 0 ? 1 : 0);CountDownLatch countDownLatch = new CountDownLatch(count);for (int i = 1; i <= count; i++) {Map<String, Object> map = new HashMap<>(3);map.put("start", (i - 1) * limit);map.put("end", limit);map.put("path", "d:\\excel\\");iUserService.excuteAsyncTaskDatabase(map, countDownLatch);}try {countDownLatch.await(); //保证之前的所有的线程都执行完成,才会走下面的;// 这样就可以在下面拿到所有线程执行完的集合结果} catch (Exception e) {log.error("阻塞异常:" + e.getMessage());} finally {long end = System.currentTimeMillis();log.info("excel任务执行完毕,共耗时:  " + (end - start) + "ms");}}
 @Override@Async("taskExecutor")public void excuteAsyncTaskDatabase(Map<String, Object> map, CountDownLatch cdl) {try {long startTime = System.currentTimeMillis();List<String> title = Arrays.asList("主键ID", "用户名称", "邮箱", "手机号", "性别", "密码", "年龄", "创建时间", "更新时间");List<String> key = Arrays.asList("id", "name", "email", "phone", "gender", "password", "age", "create_time", "update_time");List<Map<String, Object>> list = baseMapper.queryList(map);log.info("线程:" + Thread.currentThread().getName() + "读取数据耗时 :" + (System.currentTimeMillis() - startTime) + "ms,查询到数据量为:" + list.size());String filePath = map.get("path").toString() + UUID.randomUUID() + ".xlsx";// 调用导出的文件方法Workbook workbook = SxssfWorkbookUtil.createWorkbook(title, key, list);//将workbook转换为文件ExcelUtil.workbookToFile(workbook, filePath);long endTime = System.currentTimeMillis();log.info("线程:" + Thread.currentThread().getName() + "导出excel" + map.get("start") + ".xlsx成功 ,耗时 :" + (endTime - startTime) + "ms");log.info("剩余任务数  ===========================> " + cdl.getCount());} catch (Exception e) {log.error("文件生成异常" + e.getMessage());} finally {// 执行完线程数减1cdl.countDown();}}
    /*** 大文件导出** @param title 列标题头* @param key   字段英文* @param data  数据* @return*/public static SXSSFWorkbook createWorkbook(List<String> title, List<String> key, List<Map<String, Object>> data) {try {//创建poi导出数据对象SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(100);//创建sheet页SXSSFSheet sheet = sxssfWorkbook.createSheet();//设置表头信息SXSSFRow headRow = sheet.createRow(0);//设置标题头for (int j = 0; j < title.size(); j++) {headRow.createCell(j).setCellValue(title.get(j));}//遍历数据for (int i = 0; i < data.size(); i++) {SXSSFRow dataRow = sheet.createRow(sheet.getLastRowNum() + 1);for (int j = 0; j < key.size(); j++) {dataRow.createCell(j).setCellValue(data.get(i).get(key.get(j)).toString());}}return sxssfWorkbook;} catch (Exception e) {log.error(e.getMessage());}return null;}

poi实现多线程大数据导出相关推荐

  1. 解决POI大数据导出Excel内存溢出、应用假死

    最近公司一个06年统计项目在导出Excel时造成应用服务器内存溢出.假死现象:查看代码发现问题一次查询一整年的数据导致堆内存被撑爆(假死),随后改用批量查询往Excel中写数据,同样的问题又出现了!! ...

  2. Apache POI和EasyExcel 第三集:Apache POI的Excel大数据量写入(分为03版的xls、07版的xlsx、升级版SXSSF)

    Apache POI和EasyExcel 第三集:Apache POI的Excel大数据量写入(分为03版的xls.07版的xlsx.升级版SXSSF) 一.结果 我的03跑了1.204秒,07跑了5 ...

  3. 大数据导出POI之SXSSFWorkbook

    最近要求一次性导出50W以上的数据,TMD 开始用的是XSSFWorkbook瞬间内存暴涨到2G然后内存溢出了,嘎嘎-- 查了API才知道POI还有SXSSFWorkbook专门处理大数据,爱死你了P ...

  4. 大数据导出Excel导致内存溢出的解决方案

    一.问题描述: 公司之前的项目中客户有一个需求是将业务数据导出到Excel表中,方便他们对账,单个导出任务数据量近100W,每当月初任务量多时,导出的项目就会内存溢出,挂掉. 二.原因分析: 1.每个 ...

  5. POI之SXSSFWorkbook大量数据导出至excel有关内存溢出

    一:简介 SXSSFWorkbook是用来生成海量excel数据文件,主要原理是借助临时存储空间生成excel,SXSSFWorkbook专门处理大数据,对于大型excel的创建且不会内存溢出的,就只 ...

  6. 大数据导出excel大小限制_大数据量导出Excel的方案

    测试共同条件: 数据总数为110011条,每条数据条数为19个字段. 电脑配置为:P4 2.67GHz,1G内存. 一.POI.JXL.FastExcel比较 POI.JXL.FastExcel均为j ...

  7. 大数据导出excel大小限制_EXCEL大数据量导出的解决方案

    将web页面上显示的报表导出到excel文件里是一种很常见的需求.润乾报表的类excel模型,支持excel文件数据无失真的导入导出,使用起来非常的方便.然而,当数据量较大的情况下,excel本身的支 ...

  8. POI百万级大数据量EXCEL导出

    一. 简介 excel导出,如果数据量在百万级,会出现俩点内存溢出的问题: 1. 查询数据量过大,导致内存溢出. 该问题可以通过分批查询来解决: 2. 最后下载的时候大EXCEL转换的输出流内存溢出: ...

  9. poi大数据导出的基本过程

    //初始化 FileOutputStream fos = null; SXSSFWorkbook sxssfWorkbook = null; // 导出的excel,全文件名 final String ...

最新文章

  1. MySQL · 引擎介绍 · Sphinx源码剖析(三)
  2. 分布式深度学习最佳入门(踩坑)指南
  3. 《强化学习周刊》第21期:EMNLP 2020-2021强化学习的最新研究与应用
  4. UIBezierPath路径绘图
  5. C语言经典例80-猴子分桃
  6. could not initialize proxy - no Session
  7. 游戏UI设计干货:怎么让游戏界面更具科技感?
  8. Hive的基本操作-创建表的格式
  9. 云原生 | .NET 5 with Dapr 初体验
  10. css flexbox模型_代码简介:CSS Flexbox有点像旅行
  11. vue 圆形 水波_vue项目百度地图+echarts的涟漪水波效果
  12. Mapxtreme Java 地图缩放,平移操作的原理和实现
  13. Silverlight+WCF 新手实例 象棋 棋子定位与象棋类(四)
  14. Sphinx 文档例子
  15. 大数据杀熟,是真的吗?
  16. 超级详细的Junit单元测试教程
  17. imp命令导入指定表_转载:Oracle导出导入dmp文件(exp.imp命令行)
  18. UVALive - 4636 Cubist Artwork——思维
  19. games202:三,实时环境光照IBL + PRT
  20. HTML实现简单的网页设计。

热门文章

  1. poscms统计数据调用
  2. pada mysql
  3. 整数:求数组Nums中只出现一次的数
  4. 你一个包含n个整数nums,判断nums中是否存在三个元素a,b,c,使得a+b+c=0?
  5. 二进制部署高可用Kubernetes v1.17.x
  6. 如何做到像百度云或者网易公开课一样动态更换APP启动图
  7. Word每日一个小技巧:实现方框内点击自动打√[超详细版]
  8. Electron使用sqlite3 出现install aws-sdk和_handle的解决方案!
  9. 中职升高职c语言程序设计教程课后答案,2020年高职单招计算机类技能复习题及答案(中职生)...
  10. i513500h和r5 5600h选哪个 r55600h和i513500h差多少