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

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

maynowei11小时前技术知识4

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

答案在评论区。

相关文章

成功上岸腾讯运营,教你如何写校招简历?

产品策划/运营的校招简历应该怎么写?作者从自身实际情况出发,总结分享了相关经验,希望对你有用。写在前面红红火火恍恍惚惚,本人是一位2020届本科毕业生,校招意向互联网产品类。此前有过产品相关的项目&a...

去哪儿暑期PM实习一月记:在互联网公司做产品实习是怎样一种体验

人人都是产品经理旗下【起点学院】推出产品经理“365天”成长计划,BAT大牛带你学产品! 在毕业前的最后一个暑假,缘分使然找了几个月暑期实习之后进入了去哪儿,申请提前入职工作至今正好满一个月。原先有在...

单片机C语言编程,心得都在这里了

单片机写代码总踩坑,头文件被无视,老工程师的经验哪里来?前几天写8x8矩阵键盘的程序,搞了三天代码一直乱报错。后来发现自己连头文件是什么都不清楚,之前写的都是小程序,压根没碰过.h文件。看别人的程序都...

Android监听滚动视图(监听页面滚动)

Android UI Libs之Android-ObservableScrollView1. 说明Android-ObservableScrollView,顾名思义,Android上观察滚动的视图,可...

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

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

CPU「离奇」飙到 100%!开发者挖出 Linux 内核 16 年老 Bug:这么多年竟无人发现?

【CSDN 编者按】每一次对旧设备的升级都仿佛是一场跨越时代的冒险。本文作者致力于将基于 PXA166 的 Chumby 8 设备从 Linux 2.6.28 版本升级到现代 6.x 版本,然而,在看...