生产级「百万数据导入」笔记总结
💾 生产级「百万数据导入」笔记总结
🧩 1. MultipartFile 转本地临时存储
- 将上传的 Excel 文件保存至本地临时目录,能及时响应前端。
📊 2. 创建导入进度
-
初始化导入任务信息:
- 导入UUID
- 阶段状态
- 总条数、成功条数、失败条数、重复数
- 失败文件地址(导出路径)
-
进度信息存储至数据库,供前端轮询查询。
-
可统计当前系统同时导入中的数量,做导入频率限制。
⚙️ 3. 异步执行导入
- 使用线程池或 Spring 的
@Async异步方法。 - 每个任务独立运行,避免阻塞主线程。
📈 4. 获取总条数
- 使用 EasyExcel 首次快速解析文件,仅统计总行数。
- 为后续导入进度显示做准备。
🗂️ 5. 准备基础数据
- 提前加载数据量较小的字典项、从表数据等。
- 避免重复访问数据库。
🧵 6. 使用 EasyExcel 创建 Listener 批量解析数据
利用 EasyExcel 的
AnalysisEventListener,结合分批次逻辑,边解析边处理。
🧩 6.1 单行解析逻辑(invoke 方法)
✅ 6.1.1 入参校验
- 使用
@Valid或自定义校验器对字段进行合法性校验。 - 可配置化设置校验规则(如字段长度变化通过配置文件控制,不需重启)。
🔁 6.1.2 状态转换
- 将 Excel 中的状态值(如“启用”、“停用”)转换为系统枚举或码值。
📚 6.1.3 字典填充
- 将字段值映射为字典表中的值(如“男”→
1,"女"→2)。
❌ 6.1.4 失败数据记录
- 使用结构化对象保存每条失败记录,供后续生成失败文件。
🧵 6.2 批量处理逻辑(saveData 或自定义批次处理)
🧪 6.2.1 批次数据校验
- 按照当前批次内的主键/唯一字段构建
IN查询,避免单条数据库校验。
🔍 6.2.2 重复数据校验
- 校验当前文件内的重复行。
- 与数据库中现有数据重复检查(如唯一约束字段)。
🔗 6.2.3 从表引用校验
- 校验外键字段是否能在从表中匹配。
- 比如:部门 ID 是否存在、商品分类是否正确等。
❌ 6.2.4 失败数据记录
💾 6.3 插入成功数据
- 推荐使用 MyBatis 批量
insert。 - 可结合
foreach标签或 MyBatis Plus 批处理功能。
📊 6.4 实时记录导入进度
- 每批次处理后更新任务状态及计数信息。
- 提供任务状态查询接口供前端轮询显示。
📁 7. 生成失败文件
- 使用 EasyExcel 或 Apache POI 导出失败记录 Excel 文件。
- 每条记录包含失败原因,方便用户查看并修正数据。
- 提供导出文件下载链接或接口。
- 失败文件应该与导入文件格式模板相同,可支持修改后直接导入。
🪄 8. 导入结果推送(可考虑)
-
导入完成后通过 WebSocket 或邮件/消息通知用户;
-
可对接企业微信、钉钉机器人进行导入完成推送。
浙公网安备 33010602011771号