100万数据导出,居然爆炸了OutOfMemoryError?【EasyPoi实战系列】- 第472篇

news/2024/5/20 13:00:26/文章来源:https://blog.csdn.net/linxingliang/article/details/130961906

历史文章(文章累计460+)

《国内最全的Spring Boot系列之一》

《国内最全的Spring Boot系列之二》

《国内最全的Spring Boot系列之三》

《国内最全的Spring Boot系列之四》

《国内最全的Spring Boot系列之五》

《国内最全的Spring Boot系列之六》

用Midjourney画个美女,AI绘画也太强大了!!! - 第8篇

【EasyPoi实战系列】Spring Boot使用EasyPoi的注解让表格更漂亮以及图片的导出 - 第468篇

推荐一款idea神级代码插件【Bito-ChatGPT】而且免费!- 第9篇

【EasyPoi实战系列】Spring Boot使用EasyPoi实现一对多的导出 - 第469篇

【EasyPoi实战系列】Spring Boot使用EasyPoi实现多Sheet导出 - 第470篇

【EasyPoi实战系列】Spring Boot使用EasyPoi动态控制导出的列 - 第471篇

悟纤:师傅,这回真的玩脱了。

师傅:怎么说,你又搞啥了见不得人的的事情。

悟纤:你这脑洞现在可以了,什么叫见不得人的事情。

师傅:那现在还有事情可以难得住你呐。

悟纤:这一次夸大了,产品让我把数据库100万的用户数据导出,我以为会很顺呢,结果导出半天,数据没导出,程序直接就炸了GC overhead limit exceeded。

师傅:这个大数据的导出,是不能用普通的导出数据的方式的,今天师傅就给你放个大招。

悟纤:师傅,你真是我的救世主,在我最困难的时候,总能来救助我。

师傅:好话就不用说了,解决问题之后,请我去吃一顿好的。

悟纤:师傅,你说这个是事情吗,别说是一顿,十顿饭都不成问题。

悟纤:问题搞起,饭饭搞起~

导读

Hi,大家好,我是悟纤

我就是我,不一样的烟火。我就是我,与众不同的小苹果。

大数据导出是当我们的导出数量在几万,到上百万的数据时,一次从数据库查询这么多数据加载到内存然后写入会对我们的内存和CPU都产生压力,这个时候需要我们像分页一样处理导出分段写入Excel缓解Excel的压力。

说明:本节的例子的导出实体类是基于前面的章节的实体类进行使用的,所以看的有点蒙圈的小伙伴可以查看前面的文章:

👇🏻👇🏻👇🏻EasyPoi实战系列

01.《【EasyPoi实战系列】Spring Boot集成EasyPoi - 第467篇》

02.《【EasyPoi实战系列】Spring Boot使用EasyPoi的注解让表格更漂亮以及图片的导出 - 第468篇》

03.《【EasyPoi实战系列】Spring Boot使用EasyPoi实现一对多的导出 - 第469篇》

04.《【EasyPoi实战系列】Spring Boot使用EasyPoi实现多Sheet导出 - 第470篇》

05.《【EasyPoi实战系列】Spring Boot使用EasyPoi动态控制导出的列 - 第471篇》

一、问题的提出

产品:悟纤,将数据库100万的用户信息导出一下~

悟纤:好的,马上。

这不开发好的导出功能吗,这个还不简单么,今天绝对不能加班了。

于是,我写了这么一段代码:

/** * 大数据导出1.0 * /demo/exportExcel4 * @param response */@GetMapping("/exportExcel4")public void exportExcel4(HttpServletResponse response) throws IOException {    Date start = new Date();    // 模拟数据    List<UserExportVO> users = new ArrayList<>();    for (int i = 0; i < 1000000; i++) {  //一百万数据量        users.add(new UserExportVO("悟纤-"+i,1,new Date(),"18688888888","abc"+i+"@qq.com",null,"公众号SpringBoot"));    }    ExcelUtil.exportExcelX(users, "测试导出表", "sheet1", UserExportVO.class, "测试导出表.xlsx", response);    System.out.println("耗时:"+(new Date().getTime() - start.getTime())/1000+"秒");}

能否导出?能,导出耗时:115秒,导出文件大小:157M。

二、大数据导出

导出是能够与导出了,但是耗时太长了,有办法减半吗?导出文件大小太大了,能办法减半吗?

必须的,这就是这节要介绍的,大数据导出。

大数据导出是当我们的导出数量在几万,到上百万的数据时,一次从数据库查询这么多数据加载到内存然后写入会对我们的内存CPU都产生压力,这个时候需要我们像分页一样处理导出分段写入Excel缓解Excel的压力。

大数据导出主要是使用到了ExcelExportUtil.exportBigExcel的方法:

欧了,那就来写个小栗子,看看效果如何:

/** * 大数据导出2.0 * /demo/exportExcel5 * @param response */@GetMapping("/exportExcel5")public void exportExcel5(HttpServletResponse response) throws IOException {    Date start = new Date();    Workbook workbook = null;    ExportParams params = new ExportParams("大数据测试", "测试");    workbook = ExcelExportUtil.exportBigExcel(params, UserExportVO.class, new IExcelExportServer() {        @Override        public List<Object> selectListForExcelExport(Object obj, int page) {            if (((int) obj) == page) {                return null;            }            List<Object> list = new ArrayList<Object>();            for (int i = 0; i < 10000; i++) {//1页查询1万,总共100页,100万数据.                list.add(new UserExportVO("悟纤-"+i,1,new Date(),"18688888888","abc"+i+"@qq.com",null,"公众号SpringBoot"));            }            return list;        }    }, 100);    ExcelUtil.downLoadExcel("大数据导出测试.xlsx",response,workbook);    System.out.println("耗时:"+(new Date().getTime() - start.getTime())/1000+"秒");}

这里的最难的地方,就是接口IExcelExportServer的实现,底层会进行page++,不断的查找下一页,所以这里一定要有一段结束这个循环的逻辑。在实际项目中,更多的是查询的list的size()==0了。

page是从1开始的:

Ok,来看下导出的时间和导出的大小。

导出时间60秒左右,和刚刚的115秒,时间几乎少了一半。

导出的文件的大小,从原来的157M,变为了28M,少了6倍左右。

当然这个第一次的导出方式,文件的大小,也和导出的配置有关系,在之前为了解决图片导出问题,设置了为ExcelType.HSSF。

如果设置为ExcelType.XSSF的格式直接就OutOfMemoryError: GC overhead limit exceeded了(这种情况发生的原因是,程序基本上耗尽了所有的可用内存, GC也清理不了)。

总结

对于大数据的导出,核心要注意的就是内存溢出了。

(1)100万的数据,使用ExcelType.XSSF的方式导出,会报错:OutOfMemoryError: GC overhead limit exceeded。

(2)100万的数据,使用ExcelType. HSSF的方式导出,能导出,耗时115秒左右,导出的文件大小157M左右。

(3)大数据的导出方式,能导出,耗时60秒左右,导出的文件大小28M左右。

我就是我,是颜色不一样的烟火。
我就是我,是与众不同的小苹果。

à悟纤学院:

学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!

SpringBoot视频:http://t.cn/A6ZagYTi

SpringBoot交流平台:https://t.cn/R3QDhU0

SpringSecurity5.0视频:http://t.cn/A6ZadMBe

ShardingJDBC分库分表:http://t.cn/A6ZarrqS

分布式事务解决方案:http://t.cn/A6ZaBnIr

JVM内存模型调优实战:http://t.cn/A6wWMVqG

Spring入门到精通:https://t.cn/A6bFcDh4

大话设计模式之爱你:https://dwz.cn/wqO0MAy7

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_308872.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软考高级架构师笔记-5计算机网络

目录 1. 前言 & 考情分析2. 网络功能和分类2.1 通信技术3. OSI七层模型及协议3. 1 局域网和广域网协议3. 2 协议3. 3 交换技术、路由、传输介质4 IP地址5 网络存储技术6 其它考点8. 结语1. 前言 & 考情分析 前文回顾: 软考高级架构师笔记-1计算机硬件软考高级架构师笔…

喜讯!图扑荣获用友年度十佳产业融合生态伙伴称号

2023 年 4 月 20 日&#xff0c;由中华全国工商业联合会联合工业和信息化部、国务院国资委组织开展的 2023 年度“百场万企”大中小企业融通对接活动——智能制造 MES 产业融通对接会暨 2023 用友 BIP 技术大会 MES 生态创新专题论坛在用友产业园顺利召开。 用友年度生态合作伙…

STM32 Linux开发板丨STM32MP157开发板资料手册+实战教程+视频教程

iTOP-STM32MP157开发板是基于意法半导体STARM双Cortex-A7核加单Cortex-M4核的一款多核异构处理器。Cortex-A7内核提供对开源操作系统Linux的支持&#xff0c;借助Linux系统庞大而丰富的软件组件处理复杂应用。M4内核上运行对于实时性要求严格的应用。 开发板既有A7核&#xff…

一般测试用例执行过程的四个步骤

一般测试用例执行过程的四个步骤 测试用例的执行过程是软件测试中非常重要的一环&#xff0c;它可以有效验证软件是否符合预期的功能和性能要求&#xff0c;进而保证软件的质量和稳定性。一般来说&#xff0c;测试用例的执行过程可以分为四个步骤&#xff1a; 第一步&#xff1…

Unity之2D碰撞器

1、什么是碰撞器 碰撞器是用于在物理系统中 表示物体体积的的&#xff08;形状或范围&#xff09; 刚体通过得到碰撞器的范围信息进行计算 判断两个物体的范围是否接触 如果接触 刚体就会模拟力的效果产生速度和旋转 2、参数 Edit Collider&#xff1a;编辑碰撞器 Material…

Python十类常见异常类型(附捕获以及异常处理方式)

目录 前言十类异常1.TypeError2.ValueError3.NameError4.IndexError5.KeyError6.ZeroDivisionError7.IOError8.ImportError9.AttributeError10.KeyboardInterrupt 异常捕获以及处理总结 前言 大家好&#xff0c;我是辣条哥&#xff01;今天给大家讲讲我们刚开始写代码是都会出现…

TYAN 于Computex2023 展示支持第四代英特尔至强可扩展处理器的新款服务器

【台北讯2023年5月30日】隶属神达集团&#xff0c;神雲科技旗下服务器通路领导品牌TYAN&#xff08;泰安&#xff09;&#xff0c;于2023 台北国际计算机展&#xff08;Computex 2023&#xff09;5月30日至6月2日展览期间&#xff0c;在台北世贸南港展览1馆4楼 M0701a摊位展示最…

【C++】struct 和 class 的区别

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快。时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、缘起 2、示例代码 3、总结 1、缘起 在 C 中&#xff0c;struct 和 class 唯一的区别就在于 默认的访问权限不同。区别如下&#xff1a; …

界面控件DevExpress WinForms全新的UI模板,解决各种业务线需求!

去年秋天DevExpress官方发布了一个新的 WinForms UI模板预览版&#xff08;第一个EAP只提供给DevExpress宇宙版激活的用户&#xff09; &#xff0c;这些精炼的、随时可用的“模板”旨在启动表单设计/开发过程。有了这个模板&#xff0c;用户可以创建/交付现成的UI解决方案&…

MySQL进阶- SQL优化和视图

目录 SQL优化插入数据时的SQL优化&#xff08;insert优化&#xff0c;和大批量数据插入&#xff09;主键优化order by优化&#xff08;排序操作的优化&#xff09;group by优化&#xff08;分组优化&#xff09;limit优化&#xff08;分页查询优化&#xff09; SQL优化 插入数…

高压放大器在驱动压电陶瓷进行铝板无损检测中的应用研究

想要达成在不损害或不影响被测对象使用性能及自身性质的前提下&#xff0c;对被测对象内部进行缺陷&#xff0c;结构&#xff0c;失效分析&#xff0c;就得用到无损检测&#xff08;Non Destructive Testing&#xff09;技术&#xff0c;最常用的无损检测方法有很多&#xff0c…

软件测试总结

软件生命周期(SDLC)的六个阶段 1、问题的定义及规划 此阶段是软件开发方与需求方共同讨论&#xff0c;主要确定软件的开发目标及其可行性。 2、需求分析 在确定软件开发可行的情况下&#xff0c;对软件需要实现的各个功能进行详细分析。需求分析阶段是一个很重要…

Web的基本漏洞--CSRF漏洞

目录 一、CSRF漏洞介绍 1.CSRF漏洞原理 2.CSRF漏洞的类型 3.漏洞识别 4.漏洞攻击 5.CSRF漏洞的危害 6.CSRF漏洞防御 7.CSRF和XSS的区别 一、CSRF漏洞介绍 1.CSRF漏洞原理 CSRF&#xff08;cross site request forgery&#xff09;是指跨站请求伪造,是指利用受害者尚未…

whistle以及谷歌插件Proxy SwitchyOmega实现代理

whistle提供本地服务器&#xff0c;以及代理 Proxy SwitchyOmega拦截浏览器的网络请求&#xff0c;指向whistle服务 ip 为什么要用它们呢&#xff1f; 其实一开始使用的是mac的charles&#xff0c;但是出现了网页上传文件数据的时候会被篡改&#xff0c;也可能是我配置的原因…

交换机的4种网络结构方式:级联方式、堆叠方式、端口聚合方式、分层方式

交换机是计算机网络中重要的网络设备之一&#xff0c;用于实现局域网&#xff08;LAN&#xff09;内部的数据转发和通信。交换机可以采用不同的网络结构方式来满足不同的网络需求和拓扑结构。本文将详细介绍交换机的四种网络结构方式&#xff1a;级联方式、堆叠方式、端口聚合方…

快速实现TF03-CAN与电脑通信操作说明

目录 一、前言二、工具准备三、连接方式3.1 串口通信连接方式3.2 CAN 通信连接方式 四、TF03 与电脑通信操作说明4.1 切换为CAN通信4.2 安装 USB_CAN TOOL 驱动4.3 CAN 通信下修改波特率 五、常见问题反馈5.1 V9.11 USB-CAN tool按照上述方案发送文件指令不成功的解决方案 一、…

国产系统:麒麟之人大金仓数据库部署

一、基本信息和资源 1.1 查看服务器信息 [root7PGxjKPL4 ~]# cat /etc/*release Kylin Linux Advanced Server release V10 (Sword) DISTRIB_IDKylin DISTRIB_RELEASEV10 DISTRIB_CODENAMEjuniper DISTRIB_DESCRIPTION"Kylin V10" DISTRIB_KYLIN_RELEASEV10 DISTRI…

4、USB协议学习:USB的数据包结构

文章目录 数据包结构包(Packet)PID令牌包SETUP&OUT&IN令牌包SOF令牌包 数据包握手包ACK 握手包NAK 握手包 事务(Transaction)Setup事务OUT事务IN事务 传输(Transfer)控制传输中断传输批量传输同步传输/等时传输 端点 数据包结构 USB的通讯数据由多个传输组成&#xff0…

react antd Modal里Form设置值不起作用

问题描述&#xff1a; react antd Modal里Form设置值不起作用&#xff0c;即使用form的api。比如&#xff1a;编辑时带出原有的值。 造成的原因&#xff1a;一般设置值都是在声明周期里设置&#xff0c;比如&#xff1a;componentDidMounted里设置&#xff0c;hook则在useEff…

C++ vector类成员函数介绍

目录 &#x1f914;vector模板介绍&#xff1a; &#x1f914;特点&#xff1a; &#x1f914;vector的成员函数&#xff1a; &#x1f50d;vector构造函数&#xff1a; &#x1f50d;vector赋值函数 &#x1f50d;vector容器的判断函数 resize函数的重点内容&#xff1a; …