日期:2026-07-11
标签:#面试 #八股 #后端 #Excel #数据库 #场景题
一句话答案
采用流式解析、分批校验和批量入库,整个导入作为可恢复的异步任务运行,同时控制事务大小、内存、幂等、错误数据和数据库压力。
面试口语版
上传后先把文件存对象存储并创建导入任务,后台用 SAX/EasyExcel 逐行读取,不能一次性加载整个 Workbook。每批例如 500 到 2000 行完成格式、必填、枚举和业务校验,再使用 JDBC batch 或数据库装载工具批量写入。大事务会造成锁、日志和回滚压力,所以要分批提交并记录 checkpoint;如果要求全有或全无,可以先导入 staging 表,全部校验通过后再合并到正式表。失败行输出错误报告,重试时依赖业务唯一键保证幂等。
流程图
flowchart LR
A[上传文件] --> B[异步导入任务]
B --> C[流式解析]
C --> D[分批校验]
D --> E[(Staging表)]
E --> F[批量合并正式表]
D --> G[错误报告]
关键细节
- Excel 中日期、科学计数法、前导零、公式和空单元格都要显式处理。
- 严格限制文件大小、类型、压缩比和行列数,防止恶意文件或 Zip Bomb。
- 批量大小需压测;过大可能超 SQL 包大小、占用长事务和锁资源。
- 任务记录总行数、成功数、失败数、checkpoint 和文件哈希,支持断点恢复和防重复提交。
面试官追问
- 如何保证全部成功或全部失败?
- 部分数据错误时怎么反馈用户?
- 导入过程中服务重启如何恢复?
- 如何避免把数据库打满?
面试官追问参考答案
1. 如何保证全部成功或全部失败?
不要对几百万行开启超长事务。先流式校验并批量写 staging 表,任务全部成功后在可控事务中通过交换分区、重命名表或批量合并发布;失败时删除 staging 数据。若正式表合并也很大,则采用版本化数据集和指针切换。
2. 部分数据错误时怎么反馈用户?
错误记录包含原始行号、字段、错误码和脱敏说明,生成可下载错误文件,同时给出成功/失败数量。预先定义“有错误则全拒绝”还是“合法行部分导入”,避免行为不确定;错误数量过多时只保留前若干明细并汇总类型。
3. 导入过程中服务重启如何恢复?
任务表保存文件哈希、状态、已完成批次或行游标,每批写入和 checkpoint 更新保持一致。重启后 Worker 领取超时任务并从 checkpoint 重跑,数据库依靠业务唯一键或导入批次键幂等,不能只依赖内存进度。
4. 如何避免把数据库打满?
使用专用连接池和队列限制并发,批量写入并控制批次大小,在低峰执行;监控数据库 CPU、日志、锁、复制延迟和连接数,根据水位动态降速。大量导入优先使用数据库原生 bulk load 或 staging 库,避免逐行 ORM。
学习清单
- 掌握 SAX 流式解析、批量写入和 staging 表方案。
- 能说明幂等、checkpoint 与错误报告设计。