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

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

maynowei8个月前 (08-18)技术知识78

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

答案在评论区。

相关文章

iOS开发生涯的初恋:详解Objective-C多项改进

CSDN移动将持续为您优选移动开发的精华内容,共同探讨移动开发的技术热点话题,涵盖移动应用、开发工具、移动游戏及引擎、智能硬件、物联网等方方面面。如果您想投稿、参与内容翻译工作,或寻求近匠报道,请发送...

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

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

微软宣布SQL Server 2016,2005版将结束支持

IT之家讯 在芝加哥Ignite大会上,微软宣布了SQL Server 2016,并将于今年夏季发布公开预览版。SQL Server是由微软开发的关系型数据库管理系统,用于软件应用请求数据的存储和管理...

Android让视图折叠(安卓叠加视图设置)

Android UI Libs之ExpandableLayout1. 说明ExpandableLayout,顾名思义,可扩展的布局,是一个可以帮助我们实现折叠功能的第三方库,折叠时,只显示头部,打开时...

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

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

聊聊并发编程: Lock(并发锁有哪些)

之前学习了如何使用synchronized关键字来实现同步访问,Java SE 5之后,并发包中新增了Lock接口(以及相关实现类)用来实现锁功能,它提供了与synchronized关键字类似的同步功...