Spring Batch 5测试提示BATCH_JOB_INSTANCE表不存在问题排查
Spring Batch 4使用内存数据库(如你用的HSQLDB)时,会自动执行DDL脚本创建批处理元数据表,但升级到Spring Batch 5后这个默认行为被移除了,这就是测试报错「BATCH_JOB_INSTANCE table not found」的根本原因。
原因说明
Spring Batch 4依赖Spring Boot自动配置的默认逻辑,当检测到内存数据库时,会自动初始化批处理元数据所需的表结构。而Spring Batch 5为了让用户更自主地控制元数据表的创建,默认关闭了自动初始化元数据表的功能,即便是内存数据库也不会自动执行DDL脚本。
解决办法
1. 通过配置启用自动初始化
在测试环境的配置文件(如application-test.properties)中添加以下配置,让Spring Batch自动执行对应数据库的DDL脚本:
# 针对所有数据库环境初始化,适合测试场景 spring.batch.jdbc.initialize-schema=always # 仅针对嵌入式(内存)数据库初始化,更安全 # spring.batch.jdbc.initialize-schema=embedded
2. 手动加载DDL脚本
如果不想依赖自动配置,可以在测试类上添加@Sql注解,直接加载Spring Batch提供的对应数据库的DDL脚本。以HSQLDB为例:
@RunWith(SpringRunner.class) @SpringBatchTest @EnableAutoConfiguration @ContextConfiguration(classes = { MyConfig.class }) @TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class }) @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) @Sql(scripts = "classpath:org/springframework/batch/core/schema-hsqldb.sql") // 新增注解加载DDL public class MyIntegrationTest { @Autowired private JobLauncherTestUtils jobLauncherTestUtils; @Test public void test1() throws Exception { JobExecution jobExecution = jobLauncherTestUtils.launchJob(); // ... } }
3. 确认自动配置生效
确保测试类上的@EnableAutoConfiguration能正确加载Spring Batch的自动配置类,没有被其他配置排除。如果自定义了DataSource,也要确保Spring Batch能正确关联到该数据源。
错误信息参考
org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [SELECT JOB_INSTANCE_ID, JOB_NAME from BATCH_JOB_INSTANCE where JOB_NAME = ? and JOB_KEY = ?]
...
Caused by: java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: BATCH_JOB_INSTANCE in statement [SELECT JOB_INSTANCE_ID, JOB_NAME from BATCH_JOB_INSTANCE where JOB_NAME = ? and JOB_KEY = ?]
内容的提问来源于stack exchange,提问作者tasosioan7

