当前位置: 首页 > article >正文

EasyExcel分批写入实战:规避.withTemplate陷阱,高效防OOM方案解析

1. 为什么.withTemplate会成为内存杀手最近在优化一个数据导出功能时我遇到了一个典型的OOM内存溢出问题。场景是这样的需要将百万级数据分批查询后写入Excel最初采用了.withTemplate(file)的方式合并临时文件结果在生产环境直接崩了。这让我意识到很多开发者可能都踩过同样的坑。.withTemplate的设计初衷是用来复用已有Excel文件的样式和结构。但在大批量数据追加写入的场景下它会把整个模板文件加载到内存中。想象一下当你处理一个100MB的Excel文件时JVM需要额外分配100MB内存来存储模板内容。如果同时有多个线程执行类似操作内存压力会呈指数级增长。更糟糕的是这种内存消耗是隐形的。在开发环境测试时由于数据量小你可能完全察觉不到问题。但到了生产环境随着数据量增加内存占用会像滚雪球一样越来越大最终导致Full GC频繁甚至OOM。我亲眼见过一个线上服务因为这个原因在高峰期直接瘫痪了2小时。2. 内存友好的标准写法经过多次踩坑和性能测试我总结出一个黄金法则永远复用ExcelWriter对象。下面是经过实战验证的标准写法// 初始化阶段 String fileName large_data_export.xlsx; ExcelWriter excelWriter EasyExcel.write(fileName, ExportData.class).build(); WriteSheet writeSheet EasyExcel.writerSheet(数据报表).build(); // 分批写入阶段 int pageSize 50000; for (int page 1; ; page) { ListExportData batchData dataService.getByPage(page, pageSize); if (CollectionUtils.isEmpty(batchData)) break; excelWriter.write(batchData, writeSheet); batchData null; // 显式释放引用 System.gc(); // 建议在测试环境验证效果 } // 收尾阶段 excelWriter.finish();这个方案的精髓在于三点单例Writer整个导出过程只创建一个ExcelWriter实例避免重复初始化开销流式写入数据是分批写入磁盘的不会在内存中堆积及时释放每批数据处理完后立即置空List帮助GC回收内存实测显示处理100万条数据时内存占用可以稳定控制在200MB以内。相比之下使用.withTemplate的方案在50万条数据时就可能突破1GB内存。3. 分页查询的优化技巧光有好的写入方式还不够数据源的处理同样关键。这里分享几个分页查询的实战经验3.1 主键范围分页法-- 传统分页性能差 SELECT * FROM large_table LIMIT 100000, 50000; -- 优化分页推荐 SELECT * FROM large_table WHERE id 100000 ORDER BY id ASC LIMIT 50000;3.2 游标分页方案对于超大数据集可以考虑使用数据库游标。以MyBatis为例Select(SELECT * FROM large_table ORDER BY create_time) Options(resultSetType ResultSetType.FORWARD_ONLY, fetchSize 10000) CursorLargeData streamAll();3.3 内存分页的陷阱有些同学喜欢先查询全部数据到内存再用subList分页。这在数据量较大时非常危险我曾经见过因此导致的Full GC风暴。正确的做法是始终在数据库层完成分页。4. 高级优化与异常处理4.1 内存监控方案建议在代码中加入内存日志方便问题排查Runtime runtime Runtime.getRuntime(); long usedMB (runtime.totalMemory() - runtime.freeMemory()) / 1024 / 1024; log.info(Memory usage: {}MB, usedMB);4.2 资源泄露防护即使使用正确模式也要注意异常情况下的资源释放ExcelWriter excelWriter null; try { excelWriter EasyExcel.write(fileName).build(); // 写入逻辑... } finally { if (excelWriter ! null) { excelWriter.finish(); } }4.3 临时文件清理对于长时间运行的服务建议定期清理过期临时文件Files.walk(Paths.get(/tmp/excel_export)) .filter(Files::isRegularFile) .filter(p - p.toString().endsWith(.tmp)) .filter(p - Files.getLastModifiedTime(p).toMillis() System.currentTimeMillis() - 86400000) .forEach(p - { try { Files.delete(p); } catch (IOException e) { log.warn(Clean failed: {}, p); } });5. 性能对比实测数据为了更直观展示优化效果我用10万条测试数据做了对比实验方案内存峰值耗时CPU占用withTemplate1.2GB68s85%标准Writer复用210MB42s65%Writer复用游标查询180MB38s60%可以看到优化后的方案在内存和性能上都有显著提升。特别是在分布式环境下内存节省意味着可以支持更高的并发量。6. 常见问题排查指南6.1 文件锁问题在Windows服务器上可能会遇到文件被锁的情况。解决方案是使用NIO的Files类替代File类设置合适的文件共享策略考虑使用临时文件原子替换的方案6.2 样式丢失问题有些同学反映复用Writer会导致样式不一致。这时可以提前定义好CellStyle使用RegisterHandler统一处理在WriteSheet中预设样式6.3 大文件下载优化当导出文件超过100MB时建议添加Content-Length头启用Chunked编码考虑分卷压缩下载7. 最佳实践总结经过多个项目的实战检验我总结出以下最佳实践永远避免.withTemplate特别是在循环中使用时控制批次大小建议每批5万条左右根据硬件调整显式释放资源不仅是List包括数据库连接、IO流等添加监控指标记录内存、耗时等关键指标做好回滚方案大文件导出要有中断恢复机制最后分享一个真实案例某电商平台的订单导出功能优化前经常在促销期间崩溃。采用本文方案重构后不仅稳定支持了千万级数据导出服务器资源消耗还降低了70%。这再次证明正确的技术选型往往能带来意想不到的收益。

相关文章:

EasyExcel分批写入实战:规避.withTemplate陷阱,高效防OOM方案解析

1. 为什么.withTemplate会成为内存杀手? 最近在优化一个数据导出功能时,我遇到了一个典型的OOM(内存溢出)问题。场景是这样的:需要将百万级数据分批查询后写入Excel,最初采用了.withTemplate(file)的方式合…...

5分钟极速上手:League Akari 智能工具包让您的英雄联盟体验焕然一新

5分钟极速上手:League Akari 智能工具包让您的英雄联盟体验焕然一新 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 您是否曾因错过…...

树结构,转换

type TreeNode {children?: TreeNode[][key: string]: any }/*** 给树结构补充 canSelect 字段* 规则&#xff1a;* 1. 当前级别 > 3&#xff0c;可选* 2. 当前级别 < 3&#xff0c;但没有子节点&#xff0c;也可选* 3. 其他不可选** param tree 树数据* param level 起…...

Office自定义界面编辑器终极指南:免费打造专属Office功能区

Office自定义界面编辑器终极指南&#xff1a;免费打造专属Office功能区 【免费下载链接】office-custom-ui-editor Standalone tool to edit custom UI part of Office open document file format 项目地址: https://gitcode.com/gh_mirrors/of/office-custom-ui-editor …...

半导体行业考研择业参考:一篇写给电子信息学子的行业笔记

这是一篇基于公开资料整理的学习笔记&#xff0c;帮助准备考研或刚入行的同学了解半导体/集成电路方向的基本情况。所有数据仅供参考&#xff0c;请以官方渠道为准。一、为什么关注半导体方向&#xff1f; 最近几年&#xff0c;"芯片"这个词频繁出现在新闻里。从手机…...

Spring Boot 3.2.3项目里,用Knife4j 4.4.0给API文档加点‘料’(附JDK 17避坑点)

Spring Boot 3.2.3项目实战&#xff1a;用Knife4j 4.4.0打造专业级API文档&#xff08;含JDK 17适配指南&#xff09; 在微服务架构盛行的今天&#xff0c;API文档的质量直接影响着开发效率与协作体验。当我们将项目升级到Spring Boot 3.2.3和JDK 17这一前沿技术栈时&#xff0…...

一念成仙 攻略 核心地图移动与高级传送技巧完全指南

在众多文字修仙爱好者寻找优质玩法体验时&#xff0c;一念成仙凭借其庞大且真实的地图交互系统脱颖而出。为了帮助新手与进阶玩家在广袤的修仙世界中高效跑图&#xff0c;本篇一念成仙 攻略将结合深度的实际游玩经验&#xff0c;为您提供最专业、最可靠的地图移动与传送系统解析…...

从Postman到Kibana:一文搞懂Elasticsearch REST API的增删改查与高级查询

从Postman到Kibana&#xff1a;一文搞懂Elasticsearch REST API的增删改查与高级查询 在数据驱动的现代应用开发中&#xff0c;Elasticsearch已成为处理海量搜索和分析需求的首选引擎。但对于开发者而言&#xff0c;仅仅理解其核心概念远远不够——真正影响开发效率的&#xff…...

思源黑体TTF构建工具:从零到一打造专业多语言字体家族

思源黑体TTF构建工具&#xff1a;从零到一打造专业多语言字体家族 【免费下载链接】source-han-sans-ttf A (hinted!) version of Source Han Sans 项目地址: https://gitcode.com/gh_mirrors/so/source-han-sans-ttf 思源黑体TTF构建工具是一个专业级的字体构建系统&am…...

抖音视频批量下载终极指南:douyin-downloader完整使用教程

抖音视频批量下载终极指南&#xff1a;douyin-downloader完整使用教程 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback s…...

别再只用思维导图了!用JSMind 0.5 + Vue3 打造一个带状态流转的流程图(附完整源码)

用JSMind 0.5 Vue3构建状态流程图&#xff1a;轻量级解决方案实战 在Vue3项目中实现流程图功能时&#xff0c;开发者常面临两难选择&#xff1a;要么引入GoJS这类重型库导致项目臃肿&#xff0c;要么自行开发耗费大量时间。JSMind作为一款轻量级思维导图库&#xff0c;通过灵活…...

FPGA DDR3读写性能优化实战:基于MIG IP与AXI4总线的FIFO缓存设计

FPGA DDR3读写性能优化实战&#xff1a;基于MIG IP与AXI4总线的FIFO缓存设计 在高速数据采集和实时图像处理系统中&#xff0c;DDR3内存控制器设计一直是FPGA开发者面临的核心挑战。当数据吞吐量达到GB/s级别时&#xff0c;如何通过合理的FIFO缓存设计和AXI4总线优化来突破性能…...

别再为GEOS编译踩坑了!手把手教你用CMake搞定GEOS 3.7.5(附GeometryFactory.h源码修改指南)

从零构建GEOS 3.7.5&#xff1a;Windows平台编译实战与核心功能解析 在GIS开发领域&#xff0c;GEOS库作为处理空间几何关系的核心引擎&#xff0c;其重要性不言而喻。然而对于许多Windows平台的C开发者而言&#xff0c;从源码编译GEOS却成为了一道令人望而生畏的技术门槛。本文…...

如何免费解锁八大网盘满速下载:LinkSwift网盘助手完整指南

如何免费解锁八大网盘满速下载&#xff1a;LinkSwift网盘助手完整指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / …...

从视频拼接屏到雷达信号处理:拆解AXI4-Stream Switch在真实项目里的两种高阶用法

从视频拼接屏到雷达信号处理&#xff1a;AXI4-Stream Switch的两种高阶实战解析 在FPGA系统设计中&#xff0c;数据流的高效调度往往成为性能瓶颈的关键突破点。想象一下&#xff0c;当16路4K视频流需要实时分配到8个显示终端&#xff0c;或者32通道雷达回波数据要动态分配给4个…...

Pixel Aurora Engine一文详解:开源AI绘图工具的像素化技术实现路径

Pixel Aurora Engine一文详解&#xff1a;开源AI绘图工具的像素化技术实现路径 1. 像素艺术与AI的完美结合 Pixel Aurora Engine&#xff08;像素极光引擎&#xff09;是一款将现代AI技术与复古像素艺术完美融合的开源绘图工具。它基于先进的扩散模型&#xff08;Diffusion M…...

如何让微信聊天记录成为你的永久数字记忆?WeChatMsg完全指南

如何让微信聊天记录成为你的永久数字记忆&#xff1f;WeChatMsg完全指南 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we…...

机器学习数据准备七日速成:从清洗到特征工程实战

1. 机器学习数据准备七日速成指南刚入行时我总纳闷&#xff1a;为什么同样的算法别人跑得比我准&#xff1f;直到有次review同事代码才发现&#xff0c;人家在数据准备环节花了80%的时间。这就像做菜&#xff0c;食材处理才是真正的功夫活。今天我们就用七天时间&#xff0c;手…...

m4s-converter终极指南:3分钟解锁B站缓存视频,实现格式自由!

m4s-converter终极指南&#xff1a;3分钟解锁B站缓存视频&#xff0c;实现格式自由&#xff01; 【免费下载链接】m4s-converter 一个跨平台小工具&#xff0c;将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter …...

让聊天记忆永存:打造你的专属数字对话档案馆

让聊天记忆永存&#xff1a;打造你的专属数字对话档案馆 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeChatMsg …...

嵌入式项目数据存储的“后悔药”:Cypress FM25CL64B铁电存储器防丢数据实战指南

嵌入式系统数据安全的终极防线&#xff1a;FM25CL64B铁电存储器深度应用指南 在工业自动化设备突然断电的瞬间&#xff0c;设备参数能否完好保存&#xff1f;当医疗仪器遭遇意外重启&#xff0c;关键校准数据是否会丢失&#xff1f;这些场景正是嵌入式工程师们最不愿面对的噩梦…...

2026年必知!千川数据报表究竟该怎么看?

痛点深度剖析我们团队在实践中发现&#xff0c;众多企业在使用千川数据报表时面临诸多困境。一方面&#xff0c;数据维度繁杂&#xff0c;包含流量、转化、销售等多方面数据&#xff0c;企业难以快速准确地从中提取关键信息&#xff0c;如不同渠道流量的转化率、不同商品的销售…...

各垃圾回收器工作原理详解

Java虚拟机&#xff08;JVM&#xff09;提供了多种垃圾回收器&#xff0c;每种都有其独特的工作原理、适用场景和性能特点。以下是主流垃圾回收器的详细解析。 1. Serial / Serial Old 收集器 Serial 和 Serial Old 是历史最悠久的收集器&#xff0c;分别用于新生代和老年代&…...

深度学习在计算机视觉中的九大应用场景与技术解析

1. 计算机视觉中的深度学习应用全景计算机视觉作为人工智能领域最活跃的分支之一&#xff0c;正经历着由深度学习技术驱动的革命性变革。从智能手机的人脸解锁到自动驾驶的环境感知&#xff0c;深度学习模型通过端到端的学习方式&#xff0c;正在重塑我们处理视觉信息的基础范式…...

B站视频下载终极指南:轻松保存大会员4K高清内容

B站视频下载终极指南&#xff1a;轻松保存大会员4K高清内容 【免费下载链接】bilibili-downloader B站视频下载&#xff0c;支持下载大会员清晰度4K&#xff0c;持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 还在为无法离线观看B站精彩…...

RH850中断配置避坑指南:从TAUB定时器到CAN通信,手把手教你搞定寄存器设置

RH850中断配置实战&#xff1a;从TAUB定时器到CAN通信的寄存器避坑手册 在汽车电子和工业控制领域&#xff0c;RH850系列微控制器凭借其高可靠性和丰富的外设资源成为主流选择。但许多工程师在中断配置环节频频踩坑——我曾亲眼见过一个团队因为TAUB定时器中断标志未清除&#…...

保姆级教程:Hashcat掩码攻击破解5位数字iPhone备份密码(附Manifest.plist哈希提取全攻略)

5位数字iPhone备份密码破解实战&#xff1a;从哈希提取到掩码攻击全解析 在移动设备安全领域&#xff0c;iPhone备份密码的恢复一直是个高频需求。无论是安全研究人员进行取证分析&#xff0c;还是普通用户遗忘密码后的数据自救&#xff0c;掌握高效的密码破解技术都至关重要。…...

把Snort当“网络监控摄像头”:5分钟教你用嗅探模式分析本地网络流量(Windows实操)

用Snort打造你的网络流量监控台&#xff1a;Windows实战指南 每次看到网络监控设备上闪烁的指示灯&#xff0c;总让我想起城市路口的交通摄像头——它们无声地记录着每一辆车的通行状态。而在数字世界里&#xff0c;Snort就是这样一个"网络监控摄像头"&#xff0c;它…...

重庆数据备份公司排行榜单

数据备份行业&#xff1a;技术挑战与本地化解决方案的崛起行业痛点分析当前&#xff0c;数据备份领域正面临前所未有的技术挑战。随着数据量呈指数级增长&#xff0c;传统备份方案在效率、成本和安全性上的短板日益凸显。首先&#xff0c;海量非结构化数据的涌现使得备份窗口被…...

企业在线考试系统哪个好?企业真正关心的其实不是“便宜”,而是“能不能落地”

现在很多企业都在做数字化培训&#xff0c;也都想通过考试来检验学习效果。可一旦真正开始选系统&#xff0c;问题就来了。网上看了一圈&#xff0c;很多平台看起来功能不少&#xff0c;但真正用到企业内部时&#xff0c;就会发现并没有想象中那么顺手。有的系统适合学校&#…...