java批量操作需隔离单条记录异常,用独立方法+try-catch捕获可预期异常并记录日志与error_detail表;优先采用spring batch的skip机制;区分局部失败(可跳过)与全局失败(须中断);失败必须携带traceid、batchid等上下文信息。

Java批量操作中部分失败不可怕,关键是要让失败不传染、可追溯、能补救。不是所有异常都该中断整个批次,也不是所有失败都要重跑全部数据。
按单条记录隔离异常边界
别用一个大 try 包住整个 for 循环或 batchUpdate 调用。要把每条数据的处理逻辑拆成独立方法,比如 processOneRecord(data),并在其内部加 try-catch:
- 捕获可预期异常:ParseException、ConstraintViolationException、DataIntegrityViolationException 等
- catch 块只做三件事:打 warn 日志、写入 error_detail 表(含 traceId、batchId、原始数据摘要)、继续下一条
- 不 throw 新异常,也不 re-throw 原异常,避免跳出当前循环体
用 Spring Batch 的 skip 机制更稳妥
如果项目已接入 Spring Batch,优先使用它的原生跳过能力,比手写 try-catch 更可靠:
- 配置 skip-limit="10",表示允许最多 10 条失败后继续执行
- 声明 skippable-exception-classes,例如 SQLException、DuplicateKeyException
- 配合自定义 SkipPolicy,可实现按错误码、SQLState 或业务字段决定是否跳过
- 失败项自动移出当前 chunk,不影响事务提交,后续数据照常处理
区分局部失败和全局失败
不是所有异常都适合跳过,要从业务语义判断失败是否具备传染性:
- 局部失败:手机号为空、时间格式非法、主键冲突(可用 INSERT IGNORE 规避)→ 可记录后跳过
- 全局失败:数据库连接池耗尽、目标表被删、JDBC 驱动加载失败、事务管理器不可用 → 应立即中断并告警
- 建议用不同异常类型标识,比如 SkippableDataException 和 FatalBatchException
失败必须带上下文,否则等于没记录
不中断只是第一步,更重要的是知道“谁错了、在哪错、为什么错”:
- 每条失败记录附带唯一 traceId、批次号 batchId、步骤名 stepName、脱敏后的原始数据前 50 字符
- 用 MDC 注入日志上下文,确保 warn 日志能关联到具体批次和线程
- 统一写入结构化 error_detail 表,字段包括:id、batch_id、record_id、error_class、error_message、stack_summary、created_time
- 对 Web 接口,HTTP 状态码仍返回 200,失败详情放在响应体中,避免语义混淆
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











