Spring Batch 5迁移报错:未自动建表却查询BATCH_JOB_INSTANCE表
Spring Boot 3 + Spring Batch 5 避免自动创建Batch表却报表不存在的问题
你遇到的问题根源在于:虽然你没加@EnableBatchProcessing也没继承DefaultBatchConfiguration,但你手动创建的JobRepository用的是默认的JDBC实现(JdbcJobRepository),这个实现必须依赖Spring Batch的系统表(比如BATCH_JOB_INSTANCE)才能工作。你不想让框架自动创建这些表,但也没手动创建,所以执行SQL时就会触发表不存在的报错。
下面分两种场景给出解决方案:
场景1:需要持久化Job元数据(保留数据库存储)
如果你还是想用数据库保存Job的执行记录,只是不想框架自动建表,按以下步骤操作:
- 手动创建Batch系统表:从Spring Batch官方文档获取对应数据库的DDL脚本,手动在你的数据库中执行创建表操作。
- 关闭自动表初始化:在配置文件(
application.properties或application.yml)中添加配置,禁用Spring Batch的自动表初始化:
这样框架就不会自动执行建表语句,同时你手动创建的表能满足spring.batch.jdbc.initialize-schema=neverJdbcJobRepository的需求。
场景2:不需要持久化Job元数据(用内存存储)
如果你的Job不需要重启、集群支持,只是简单的一次性任务,可以改用内存型的JobRepository,完全脱离数据库表:
修改你创建JobRepository的代码,用MapJobRepositoryFactoryBean替代JobRepositoryFactoryBean:
@Autowired private DataSource dataSource; @Bean @Primary public PlatformTransactionManager transactionManager() { final JpaTransactionManager tm = new JpaTransactionManager(); tm.setDataSource(dataSource); return tm; } @Bean(name = "jobRepository") public JobRepository createJobRepository() throws Exception { // 改用内存型JobRepository工厂类 MapJobRepositoryFactoryBean factoryBean = new MapJobRepositoryFactoryBean(); factoryBean.setTransactionManager(transactionManager()); factoryBean.afterPropertiesSet(); return factoryBean.getObject(); } @Bean(name = "jobname") public Job jobname (PlatformTransactionManager transactionManager) throws Exception { return new JobBuilder("jobname ", createJobRepository()) .start(getAlerteReader(transactionManager)) .next(getAlerteProcess(transactionManager)) .build(); }
这样JobRepository会把元数据存在内存中,不会再访问数据库的Batch系统表,自然也不会报找不到表的错误。
内容的提问来源于stack exchange,提问作者user23649379
相关产品推荐
相关产品推荐

