线程池导入大数据量excel

一、前置准备阶段:环境准备与参数配置

  1. 依赖引入pom.xml中添加 EasyExcel 和线程池相关依赖,确保版本兼容(easyexcel 建议 2.2.10+,避免避免池使用 Spring 自带的ThreadPoolTaskExecutor

  2. 线程池 参数定制化配置 针对 Excel 导入的 IO 密集型特性,配置线程池(核心线程数 = CPU 核心数 ×2,最大线程数 = CPU 核心数 ×4,队列容量 = 100),并通过@Configuration注入 Spring 容器

  3. 业务模型与 Excel 映射类定义创建与 Excel 列对应的实体类,通过 easyexcel 注解指定表头映射和数据转换规则(如日期格式化、字段校验)

二、文件上传与预处理

  1. 接收前端上传的文件 通过 SpringMVC 的MultipartFile接收 Excel 文件,保存到临时目录(如/tmp/excel-import/),并生成唯一任务 ID(用于后续进度查询)

  2. 文件合法性校验 校验文件格式(必须为.xlsx.xls)、大小(如不超过 100MB)、表头是否匹配(通过 easyexcel 的headRowNumber解析表头并对比预期字段)

三、任务拆分与分发

  1. 按文件 / Sheet 页拆分任务 主线程读取 Excel 的 Sheet 数量,为每个 Sheet 创建独立任务(若 Sheet 行数超过 5 万,进一步按 5 万行 / 片拆分),通过@Async注解提交到线程池

  2. 多任务并行调度 主线程收集所有子任务的CompletableFuture,通过CompletableFuture.allOf()等待所有任务完成,最终汇总结果

四、EasyExcel 流式解析与数据处理

  1. 自定义 ReadListener 处理解析逻辑 通过 easyexcel 的ReadListener逐行解析数据,实现 "读一行处理一行",避免内存堆积

  2. 启动 EasyExcel 解析任务 在子任务中调用 easyexcel 的read方法,传入自定义监听器和解析范围(startRow、endRow)

五、数据库批量写入优化

  1. 使用 MyBatis 批处理 减少 IO 在业务层开启ExecutorType.BATCH模式,累积 SQL 后一次性执行,降低数据库连接开销

  2. 控制并发写入 线程数通过 Redis 分布式锁限制同时写入数据库的线程数(如最多 5 个线程),避免数据库连接池耗尽

六、进度追踪与异常处理

  1. 实时更新任务进度在 Redis 中存储任务进度(总条数、成功数、失败数),前端通过任务 ID 轮询查询

  2. 错误数据收集与重试对解析或入库失败的行,记录行号和错误原因,导入完成后生成 "错误 Excel" 供用户下载修正

七、资源清理与任务归档

  1. 临时文件清理导入完成后(无论成功 / 失败),通过定时任务删除临时目录的 Excel 文件(保留 7 天备份)

  2. 任务结果归档将导入结果(总条数、成功数、错误信息)存入数据库归档,便于后续审计和问题追溯

相关推荐
小钱c713 小时前
Python使用 pandas操作Excel文件并新增列数据
python·excel·pandas
Shi_haoliu15 小时前
Vue2 + Office Add-in关于用vue项目于加载项控制excel单元格内容(Demo版)
前端·javascript·vue.js·node.js·html·excel·office
njsgcs15 小时前
json转excel python pd
python·json·excel·pd
RECRUITGUY16 小时前
Excel中将毫秒时间戳转换为标准时间格式
excel
SunkingYang18 小时前
详细介绍C++中捕获异常类型的方式有哪些,分别用于哪些情形,哪些异常捕获可用于通过OLE操作excel异常
c++·excel·mfc·异常捕获·comerror
lied16636348061 天前
List导出到Excel文件
servlet·list·excel
ZhengEnCi1 天前
Excel 文件结构完全指南-从基础概念到 Python 读取的实用宝典
python·excel
核桃杏仁粉1 天前
excel拼接数据库
数据库·oracle·excel
cx330上的猫1 天前
价值1w的数据分析课知识点汇总-excel使用(第一篇)
数据挖掘·数据分析·excel
小薛引路1 天前
office便捷办公06:根据相似度去掉excel中的重复行
windows·python·excel