spring batch 企业级批处理的关键在于流程组织、粒度控制与失败应对,通过 job/step 分层、chunk 模式、元数据持久化、异步启动和参数化运行实现可监控、可重启、可伸缩。

用 Spring Batch 构建企业级高性能批处理作业,关键不在“写多少代码”,而在于“怎么组织流程、控制粒度、应对失败”。它不是替代 for 循环的工具,而是把批量任务变成可监控、可重启、可伸缩的工程化模块。
Job 与 Step 的分层设计
一个 Job 是完整业务目标的封装,比如“每日用户积分结算”;它由多个 Step 组成,每个 Step 职责单一、状态独立:
- Step1:从订单库分页读取当天交易(
PagingItemReader) - Step2:按用户 ID 聚合金额并计算积分(
ItemProcessor) - Step3:写入积分明细表 + 更新用户总积分(
JdbcBatchItemWriter)
Step 之间天然解耦。第 3 步失败时,下次启动 Job 会自动跳过已成功执行的前两步,直接从 Step3 恢复——这依赖 JobRepository 对 JobExecution 和 StepExecution 的持久化。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
Chunk 模型控制内存与事务边界
避免一次性加载百万条记录进内存,Spring Batch 默认采用 chunk 处理模式:每次读取 N 条、处理 N 条、再统一提交 N 条。
-
.chunk(500)表示每 500 条为一个事务单元,既降低数据库锁持有时间,又防止 OOM - 配合
@Transactional和ISOLATION_READ_COMMITTED,确保单个 chunk 内部强一致性 - 若某条数据解析失败(如日期格式错误),可通过
SkipPolicy跳过,不影响整块提交
生产环境必须配置的三项
不配这三项,作业就谈不上“企业级”:
-
元数据持久化:必须用 MySQL 或 PostgreSQL 初始化
BATCH_*表(通过schema-mysql.sql脚本),禁用内存版MapJobRepositoryFactoryBean -
异步启动器:
SimpleJobLauncher配合ThreadPoolTaskExecutor,线程数建议设为 CPU 核心数 × 1.5,避免阻塞 Web 容器线程 -
参数化运行:用
JobParameters传入文件路径或日期(如run.date=20260916),保证同一 Job 多次执行互不干扰
性能优化的实用手段
当单机吞吐遇到瓶颈,不用重写框架,只需调整组合方式:
- 对超大文件:用
MultiResourceItemReader合并多个 CSV,再通过ClassifierCompositeItemWriter按类型分流写入 - 对高并发场景:启用
Remote Chunking,主节点分发数据块,Worker 节点并行处理并回传结果 - 对慢速数据库:在
ItemWriter层启用批量插入(jdbcTemplate.batchUpdate)+ 关闭自动提交,比逐条 insert 快 5–10 倍
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










