线程池导入大数据量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. 任务结果归档将导入结果(总条数、成功数、错误信息)存入数据库归档,便于后续审计和问题追溯

相关推荐
Non-existent98716 天前
WPS批量清理单元格空白字符的4种方法-异常数字格式处理-实战
excel·wps
Channing Lewis16 天前
PHP 解析 Excel 的那些坑:一次“行号错位”引发的数据丢失
开发语言·php·excel
jarreyer16 天前
【数据分析绘图】excel绘图和bi工具区别
数据挖掘·数据分析·excel
chatexcel16 天前
ChatExcel Max使用教程:图片、PDF、网页与复杂Excel的一站式数据分析
数据分析·pdf·excel
cngkqy16 天前
excel从某一列中用match筛选匹配的数据
excel
qq_5469372716 天前
Excel批量转PDF_Word_图片,支持自动合并报表,效率翻倍。
pdf·word·excel
ai_coder_ai16 天前
在自动化脚本中操作excel文件
运维·自动化·excel
三千花灯16 天前
【Playwright】 自动化测试之参数化登录(Excel/CSV 数据源)
人工智能·机器学习·excel
罗政16 天前
AI工作流实现Excel全自动化(支持SQL)-案例:医院门诊排班表
人工智能·自动化·excel
小妖66616 天前
excel 怎么在单元格内容自动加上一段文字不能用公式
excel·vba