生产级「百万数据导入」笔记总结


💾 生产级「百万数据导入」笔记总结

🧩 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 或邮件/消息通知用户;

  • 可对接企业微信、钉钉机器人进行导入完成推送。


posted @ 2025-05-21 09:57  哔~哔~哔  阅读(66)  评论(0)    收藏  举报