当前位置:首页 > 技术知识 > 正文内容

Spring Batch 秒级处理百万级数据,内存占用降低95%

maynowei7个月前 (08-18)技术知识63

Excel导入一次吃掉8G内存,服务器当场卡死,老板在群里连发十个感叹号

把百万行Excel塞进数据库,90%的程序员第一反应是POI。

一次读完整个文件,内存飙到几个G,GC疯狂回收,CPU原地打转。

现场演示:20万行用户表,PoiItemReader直接吃掉7.8G,换成流式读取,瞬间降到380M,差距95%。

Spring Batch官方扩展包spring-batch-excel里藏着两个Reader。

PoiItemReader功能全,公式、样式都能识别,代价是把整张表一次性搬进内存。

StreamingXlsxItemReader只保留当前行,读完就扔,内存曲线像跳楼机。

代价是公式、合并单元格、富文本全部失效,数据必须干净。

真实项目踩坑记录:某电商大促,凌晨三点运营甩过来一个300M的订单文件。

老代码用PoiItemReader,启动5分钟后容器被K8s直接Kill。

临时改流式,十分钟跑完,内存峰值不到400M。

血的教训:文件超过50M就别用POI全家桶。

RowMapper写法也得换。

PoiItemReader给的是RowSet,能按列名取值。

StreamingXlsxItemReader只给String[],下标从0开始,表头得自己跳过。

代码少写一行,线上就多一次ArrayIndexOutOfBounds。

Chunk大小别乱调。

原文示例给10,实测20万行数据,chunk=1000时吞吐量最高,内存还能再省10%。

再大就适得其反,一次提交太多,数据库反而扛不住。

经验值:单行数据小于1K,chunk给500到2000之间最稳。

Job参数记得带时间戳。

同一个文件跑两次,Spring Batch默认当成同一个任务直接跳过。

加一行LocalDateTime.now(),每次启动都是新任务。

别问怎么知道的,运维凌晨四点电话吵醒的。

最后留一个思考题:如果Excel里混着图片、合并单元格、公式,流式读取全废,怎么办?

答案在评论区。

相关文章

B端产品设计之业务设计(b端产品ui设计)

编辑导语:在这篇文章里,作者从解决方案设计、业务流程设计、产品功能设计三个方面,分析了如何进行B端产品的业务设计,感兴趣的小伙伴们一起来看一下吧。前篇文章讲了业务梳理,还没看过的同学可以先看看前篇文章...

Shopee新手指南:Shopee卖家中心用户界面介绍

1.Shopee各站点前台网页链接:2.Shopee各站点后台网页链接3.Shopee APP下载:安卓版下载链接:https://pan.baidu.com/s/1eSp8M1k#list/path...

Go语言进阶:时间轮(golang时间轮)

时间轮概念时间轮(Timing Wheel)是一种高效的定时任务调度数据结构,特别适合处理大量定时任务。它通过一个循环数组(轮盘)和多个槽位(buckets)来组织定时任务,每个槽位代表一个时间间隔。...

Oracle 不是有效的导出文件,标头验证失败 解决方法

第一种:网上搜索到的大多解决方法是说导出文件时使用的Oracle版本不一致问题,需要修改dmp文件的版本号。如果确定版本号确实不一样,请自行搜索一下解决方法。第二种:备份dmp文件时,备份的语句可能使...

Oracle 11g安装教程完整版(oracle 11g 安装教程)

由于工作需要,将安装的经验分享给大家。第一步:首先准备安装文件包:Oralce 11.2.0.4 64bit和plsqldev1405x64如图所示:第二步:将2个文件解压到同一个目录,如图所示:第三...

Oracle公布Java9未来进度表(oracle的未来)

作为1995年由Sun公司推出的产品,Java既是指一种程序设计语言,也包含了Java平台。因其平台无关、安全、高性能、自动垃圾回收等特点,Java已经推出便受到广泛应用。Java软件开发工具包(Ja...