Spring Batch 的 chunk 到底是什么?设多大合适?Boot 重启为什么会因为 Batch 启动失败?处理器返回 null 会怎样?中途失败已经写入的数据还在吗?为什么同样的参数不能再跑一次?这篇在 Spring Batch 6.0.5 和真实 MySQL 上逐项实测。
第一次启动(spring.batch.job.enabled 保持默认): Tasklet 执行了 | 应用结束时 BATCH_JOB_EXECUTION 共 1 行
第二次启动(同一个库、Job 没有 JobParameters):退出码 1,没有任何输出;异常:Exception in thread "main" java.lang.IllegalStateException: Failed to execute ApplicationRunner / Caused by: org.springframework.batch.core.launch.JobInstanceAlreadyCompleteException: A job instance already exists and is complete for identifying parameters={}. If you want to run this job again, c
spring.batch.job.enabled=false: 应用结束时 BATCH_JOB_EXECUTION 共 1 行spring.batch.job.enabled 默认 true,重启会重跑 Job。
chunk=1:Job COMPLETED/Step COMPLETED,read=5000 filter=0 write=5000 commit=5000 rollback=0,writer 被调用 5000 次,表里 5000 行,耗时 2247 ms chunk=10:Job COMPLETED/Step COMPLETED,read=5000 filter=0 write=5000 commit=500 rollback=0,writer 被调用 500 次,表里 5000 行,耗时 363 ms chunk=100:Job COMPLETED/Step COMPLETED,read=5000 filter=0 write=5000 commit=50 rollback=0,writer 被调用 50 次,表里 5000 行,耗时 169 ms chunk=1000:Job COMPLETED/Step COMPLETED,read=5000 filter=0 write=5000 commit=5 rollback=0,writer 被调用 5 次,表里 5000 行,耗时 147 ms
提交次数 = 条数 ÷ chunk,耗时随 chunk 增大先降后平。
Job COMPLETED/Step COMPLETED,read=1000 filter=500 write=500 commit=10 rollback=0,writer 被调用 10 次,表里 500 行
processor 返回 null 即过滤。
Job FAILED/Step FAILED,read=300 filter=0 write=200 commit=2 rollback=1,ExitStatus=FAILED,表里 200 行(两个完整的 chunk 已经提交,第三个整块回滚)
当前 chunk 整块回滚,前面的保留。
第一次:COMPLETED
第二次抛出 JobInstanceAlreadyCompleteException:A job instance already exists and is complete for identifying parameters={JobParameter{name='date', value=2026-10-22, type=class java.lang.String, identifying=true}}. If you want to run this job again, change the parameters.
换一个参数 date=2026-10-23:COMPLETED
BATCH_JOB_INSTANCE 里 daily 的实例数 2;BATCH_JOB_EXECUTION 里 daily 的执行数 2
元数据表:[BATCH_JOB_EXECUTION, BATCH_JOB_EXECUTION_CONTEXT, BATCH_JOB_EXECUTION_PARAMS, BATCH_JOB_EXECUTION_SEQ, BATCH_JOB_INSTANCE, BATCH_JOB_INSTANCE_SEQ, BATCH_STEP_EXECUTION, BATCH_STEP_EXECUTION_CONTEXT, BATCH_STEP_EXECUTION_SEQ]
应用结束时 BATCH_JOB_EXECUTION 共 8 行Job 名 + 标识参数,完成后不能重跑。