文章背景图

百万级数据导出Excel性能优化实践(基于Hutool)

2025-02-18
121
-
- 分钟

业务场景与问题背景

在最近的数据导出需求中,我们需要将百万量级的数据库记录导出为Excel文件。初始方案采用Hutool的ExcelWriter工具,但在实际运行中发现了以下严重问题:

  1. 内存占用飙升直至OOM崩溃

  2. 每1000条数据处理耗时达20秒

  3. SQL执行效率低下

  4. 生成文件过大无法邮件传输

性能优化全流程

一、内存泄漏问题优化

现象追踪

通过JDK自带的jvisualvm工具监控发现:

  • JVM堆内存持续增长无回落

  • Full GC频率异常升高

  • 最终导致服务不可用

问题根源

Excel.getWriter()默认使用XSSFWorkbook实现,会将所有数据缓存在内存中,导致:

  • 每个单元格产生一个POJO对象

  • 行对象无法及时GC回收

  • 内存占用量与数据量呈线性增长

解决方案

改用流式写入模式:

// 创建支持SXSSF的BigExcelWriter
ExcelWriter writer = ExcelUtil.getBigWriter(filePath);

优化效果

优化前:内存持续飙升

优化后:正常


二、数据处理耗时优化

发现三个主要问题:

  1. 循环内重复查询数据库

  2. 嵌套循环导致O(n²)复杂度

  3. 频繁的IO操作

优化方案

  1. 缓存预热机制

  1. 循环结构重构

  1. 并行流加速处理

优化效果

优化前:每1000条耗时20s

优化后:每1000条耗时不到1s


三、SQL执行优化

慢SQL分析

原始动态SQL问题:

  • 嵌套子查询3层

  • 全表扫描type=ALL

  • 未命中组合索引

优化方案

  1. 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
  1. 分页策略调整

优化前:执行速度很长

优化后:执行时间不到1s


四、文件传输方案优化

问题分析

  • 原始方案:直接邮件附件

  • 限制条件:

    • 邮件系统限制附件≤10MB

    • 大文件传输不稳定

优化方案

  1. 文件压缩处理

  1. 云存储方案选型

实施效果

  • 文件大小减少为原来的5分之1

  • 下载链接有效期2小时

  • 邮件到达率提升至100%


经验总结

  1. 流式处理是解决内存问题的关键

  2. 批量操作相比单条处理有数量级提升

  3. 数据库访问要做到"能查一次绝不查两次"

  4. 分布式场景下合理利用中间存储

评论交流

文章目录