搬砖不累!Spring Batch:让批量处理像吃火锅一样爽的框架
一、框架介绍:从搬砖工到包工头的蜕变!
Spring Batch就像程序员界的「包工头」,专门解决企业级批量处理任务。想象一下:每天需要处理百万级数据导入导出、定时跑报表、批量发邮件……传统方式写代码就像搬砖——效率低还容易累瘫。而Spring Batch提供了「脚手架」:分步骤(Step)、事务管理、重试机制,让你从「搬砖工」摇身一变成为指挥项目的「包工头」!
二、核心用法:四大金刚+流水线操作
- 核心组件:分工明确的「四人组」
- Job(项目经理):定义整个批处理任务,包含多个步骤。
- Step(施工队长):拆分任务为独立步骤,每个Step负责读数据→处理→写结果。
- ItemReader(采购员):从数据库、文件等「仓库」读取数据。
- ItemProcessor(质检员):对数据「质检」、转换、加工。
- ItemWriter(搬运工):把处理好的数据写入目标地(数据库、文件等)。
- 使用三部曲
(1)Maven引入依赖(就像点外卖要选对套餐):
org.springframework.boot
spring-boot-starter-batch
(2)配置Job和Step(画施工流程图):
@Bean
public Job batchJob() {
return jobBuilderFactory.get("importJob")
.start(step1())
.next(step2())
.build();
}
@Bean
public Step step1() {
return steps.get("step1")
.chunk(100) // 每100条处理一次
.reader(reader())
.processor(processor())
.writer(writer())
.build();
}
(3)运行Job(按下「开工」按钮):
jobLauncher.run(job, jobParameters);
三、实战案例:把Excel数据灌入数据库的骚操作
假设要批量导入CSV用户数据到MySQL:
- 配置
FlatFileItemReader:指定CSV文件路径、分隔符。 - 写
CustomerProcessor:校验数据(比如手机号格式)、转换对象。 - 用
JdbcBatchItemWriter:分批次写入数据库(避免内存爆炸)。 - 加个监听器:打印进度条(搬砖也要有仪式感!)。 代码示例(简化版):
@Bean
public FlatFileItemReader reader() {
FlatFileItemReader reader = new FlatFileItemReader<>();
reader.setResource(new ClassPathResource("users.csv"));
// 配置字段映射、跳过标题行等...
return reader;
}
@Bean
public JdbcBatchItemWriter writer(DataSource dataSource) {
JdbcBatchItemWriter writer = new JdbcBatchItemWriter();
writer.setDataSource(dataSource);
writer.setSql("INSERT INTO customers(name, age) VALUES (:name, :age)");
writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>());
return writer;
}
四、底层原理:事务+分片+重试,稳如老狗
- 事务管理:默认每个Step一个事务,可配置提交间隔(
chunkSize)。 - 分片处理:把大数据拆成小任务并行处理(适合分布式场景)。
- 重试+跳过:遇到异常可自动重试或跳过(比如手机号格式错误直接跳过)。
- 元数据追踪:自动记录Job/Step状态,支持断点续跑(搬砖没搬完?下次接着搬!)。
五、对比其他框架:为什么选Spring Batch?
- vs Quartz:Quartz专注定时调度,Spring Batch专注批处理逻辑。
- vs Apache Camel:Camel擅长数据流转,Batch更适合大规模数据加工。
- 优势总结:轻量级、Spring生态无缝集成、开箱即用的弹性机制。
六、避坑指南:老司机血泪总结
- 内存溢出?分页来救场!千万别用
List一次性读全部数据,改用PagingItemReader分页读。 - 事务别贪杯!
chunkSize要适中太大影响性能,太小频繁提交。建议根据数据量和DB压力调参。 - 异常处理要优雅用
RetryPolicy和SkipPolicy,别让一个小错误搞垮整个Job! - 日志要打,监控不能少
结合Spring Boot Actuator,实时查看Job进度和资源消耗。
七、最佳实践:效率翻倍的小技巧
- 异步处理:用
TaskExecutor开启多线程读/写。 - 数据缓存:频繁读写的数据用Spring Cache。
- 断点续跑:利用
JobParameters记录处理进度。 - 性能调优:调整JVM参数(比如堆内存)、数据库连接池配置。
八、面试考点解析
- Q:Spring Batch的核心组件有哪些?
A:Job、Step、ItemReader、ItemProcessor、ItemWriter,以及事务、重试、跳过机制。 - Q:如何处理大数据量导致的OOM?
A:分页读取、流式处理、调大JVM堆内存。 - Q:如何实现Job的断点续跑?
A:通过JobParameters传递执行状态,利用数据库JobRepository记录进度。
九、总结:框架选得好,下班早
- Spring Batch就像程序员的「瑞士军刀」,专治各种批量处理难题。记住核心架构、用好分页和事务、善用重试和跳过,你也能轻松驾驭百万级数据处理!
- 最后彩蛋:遇到性能瓶颈?试试Spring Batch的「分片大法」,让多台服务器帮你搬砖!
(全文完,预计阅读时间:10分钟,搬砖效率提升200%!)