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

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

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里混着图片、合并单元格、公式,流式读取全废,怎么办?

答案在评论区。

相关文章

Win10系统除了移植Objective C,还要有Swift

IT之家讯Build2015大会最让人震惊的莫属微软推出工具,Win10系统可以移植安卓/iOS应用,特别是后者使用的Objective C编程语言,不过最新消息表明,微软连苹果最新的Swift移植也...

Objective-c单例模式的正确写法「藏」

单例模式在iOS开发中可能算是最常用的模式之一了,但是由于oc本身的语言特性,想要写一个正确的单例模式相对来说比较麻烦,这里我就抛砖引玉来聊一聊iOS中单例模式的设计思路。关于单例模式更多的介绍请参考...

机器人需求驱动导航新SOTA,成功率提升15%!浙大&vivo联手打造

CogDDN团队 投稿量子位|公众号QbitAI让机器人像人一样边看边理解,来自浙江大学和vivo人工智能实验室的研究团队带来了新进展。正如视频所展示的,机器人在复杂的室内环境中不仅能自主探索,还具备...

webview 渲染机制:硬件加速方式渲染的Android Web

webview 渲染是什么?webview 渲染是用于展现web页面的控件; webview 可以内嵌在移动端,实现前端的混合式开发,大多数混合式开发框架都是基于 webview 模式进行二次开发的w...

android培训学习的大纲(安卓app培训)

第一阶段android基础:1.基础javaJava概述,进制,数据类型,常量变量,运算符,表达式关系运算符,逻辑运算符,if语句,switch语句while循环,do...while循环,for循环...

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

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