[alibaba/easyexcel]可以分批次将数据写入到excel吗

2024-06-20 945 views
8

目前我的需求是给用户生成excel报表,一个excel表大概会有6W行左右的数据,大概会有几十的并发量,计划使用easyexcel像下面这样处理:

  1. 使用多个read线程连接远程数据库读取数据然后写入阻塞队列
  2. 使用单个write线程从队列中取数据,每取到1000就刷入到excel 我想通过这种方式防止OOM,但是ExcelWriter似乎只有调用finish才会正在的写入磁盘,在此之前数据都会驻留在内存。 HELP,我该怎么办哦。

回答

5

你要搞清楚问题的所在。6W的数据应该不会有啥问题。

  1. 异步导出,生成报表 不能几十并发,点击生成后,自己开5个线程慢慢来。
  2. 处理好sql,mybatis数据占用的内存也非常大,记得分页+flushcache
6

你要搞清楚问题的所在。6W的数据应该不会有啥问题。

  1. 异步导出,生成报表 不能几十并发,点击生成后,自己开5个线程慢慢来。
  2. 处理好sql,mybatis数据占用的内存也非常大,记得分页+flushcache

谢谢,看来也只有这样了

5

我们以前也遇到过oom,问题在于mysql 而不是poi,所以mysql 真的要注意下

9

你要搞清楚问题的所在。6W的数据应该不会有啥问题。

  1. 异步导出,生成报表 不能几十并发,点击生成后,自己开5个线程慢慢来。
  2. 处理好sql,mybatis数据占用的内存也非常大,记得分页+flushcache

@zhuangjiaju 请教一下,5 个线程怎么分配? 4 个读数据,1 个写么?如果要求内容有顺序,4 个线程读数据,还得保持线程读数据的先后顺序。 谢谢

9

你要搞清楚问题的所在。6W的数据应该不会有啥问题。

  1. 异步导出,生成报表 不能几十并发,点击生成后,自己开5个线程慢慢来。
  2. 处理好sql,mybatis数据占用的内存也非常大,记得分页+flushcache

@zhuangjiaju 请教一下,5 个线程怎么分配? 4 个读数据,1 个写么?如果要求内容有顺序,4 个线程读数据,还得保持线程读数据的先后顺序。 谢谢

jdk包里面有很多线程协同的工具类可以保证执行顺序,比如CountDownLatch之类

4

你要搞清楚问题的所在。6W的数据应该不会有啥问题。

  1. 异步导出,生成报表 不能几十并发,点击生成后,自己开5个线程慢慢来。
  2. 处理好sql,mybatis数据占用的内存也非常大,记得分页+flushcache

@zhuangjiaju 请教一下,5 个线程怎么分配? 4 个读数据,1 个写么?如果要求内容有顺序,4 个线程读数据,还得保持线程读数据的先后顺序。 谢谢

jdk包里面有很多线程协同的工具类可以保证执行顺序,比如CountDownLatch之类

谢谢回复! 哥们的意思是,我自己编排 4 个分页读取数据的线程顺序么? 如: t1 读取第一页 t2 读取第二页 t3 读取第三页 t4 读取第四页 写 excel 数据,顺序是 t1 > t2 > t3 > t4 重复上面的步骤,直至完成。

8

@JimmyLincole

谢谢回复! 哥们的意思是,我自己编排 4 个分页读取数据的线程顺序么? 如: t1 读取第一页 t2 读取第二页 t3 读取第三页 t4 读取第四页 写 excel 数据,顺序是 t1 > t2 > t3 > t4 重复上面的步骤,直至完成。

对的,我的就是这样做的

8

对的,我的就是这样做的

@614756773 好的,谢谢! 请教一下,你是如何控制最后一批次没有必要的数据库访问呢? 如:每个批次有 4 个线程,最后一批次时,第一个线程读取之后,数据就读完了,这时候第二,第三,第四线程就没必要访问数据库了。