业务场景与问题背景
在最近的数据导出需求中,我们需要将百万量级的数据库记录导出为Excel文件。初始方案采用Hutool的ExcelWriter工具,但在实际运行中发现了以下严重问题:
内存占用飙升直至OOM崩溃
每1000条数据处理耗时达20秒
SQL执行效率低下
生成文件过大无法邮件传输
性能优化全流程
一、内存泄漏问题优化
现象追踪
通过JDK自带的jvisualvm工具监控发现:
JVM堆内存持续增长无回落
Full GC频率异常升高
最终导致服务不可用
问题根源
Excel.getWriter()默认使用XSSFWorkbook实现,会将所有数据缓存在内存中,导致:
每个单元格产生一个POJO对象
行对象无法及时GC回收
内存占用量与数据量呈线性增长
解决方案
改用流式写入模式:
// 创建支持SXSSF的BigExcelWriter
ExcelWriter writer = ExcelUtil.getBigWriter(filePath);
优化效果
优化前:内存持续飙升
优化后:正常
二、数据处理耗时优化
发现三个主要问题:
循环内重复查询数据库
嵌套循环导致O(n²)复杂度
频繁的IO操作
优化方案
缓存预热机制
循环结构重构
并行流加速处理
优化效果
优化前:每1000条耗时20s
优化后:每1000条耗时不到1s
三、SQL执行优化
慢SQL分析
原始动态SQL问题:
嵌套子查询3层
全表扫描type=ALL
未命中组合索引
优化方案
CTE公共表达式优化
WITH cte_order AS (
SELECT /*+ MATERIALIZE */ id,create_time
FROM orders
WHERE create_time BETWEEN ? AND ?
)
SELECT o.*, u.name
FROM cte_order o
JOIN users u ON o.user_id = u.id分页策略调整
优化前:执行速度很长
优化后:执行时间不到1s
四、文件传输方案优化
问题分析
原始方案:直接邮件附件
限制条件:
邮件系统限制附件≤10MB
大文件传输不稳定
优化方案
文件压缩处理
云存储方案选型
实施效果
文件大小减少为原来的5分之1
下载链接有效期2小时
邮件到达率提升至100%
经验总结
流式处理是解决内存问题的关键
批量操作相比单条处理有数量级提升
数据库访问要做到"能查一次绝不查两次"
分布式场景下合理利用中间存储