我收到错误表'test.batch_job_instance'不存在

Posted

技术标签:

【中文标题】我收到错误表\'test.batch_job_instance\'不存在【英文标题】:I am getting error Table 'test.batch_job_instance' doesn't exist我收到错误表'test.batch_job_instance'不存在 【发布时间】:2018-09-01 18:28:38 【问题描述】:

我是 Spring Batch 的新手。我已经用 inmemoryrepository 配置了我的工作。但是,它似乎仍在使用 DB 来持久化作业元数据。 我的spring批处理配置是:

@Configuration
public class BatchConfiguration 
    
    
    @Autowired
    private StepBuilderFactory stepBuilderFactory;
    
    @Autowired
    private JobBuilderFactory jobBuilder;
    
    @Bean
    public JobLauncher jobLauncher() throws Exception 
        SimpleJobLauncher job =new SimpleJobLauncher();
        job.setJobRepository(getJobRepo());
        job.afterPropertiesSet();
        return job;
    
    
    
    @Bean
    public PlatformTransactionManager getTransactionManager() 
        return new ResourcelessTransactionManager();
    

    @Bean
    public JobRepository getJobRepo() throws Exception 
        return new MapJobRepositoryFactoryBean(getTransactionManager()).getObject();
    
    

    
    
    @Bean
    public Step step1(JdbcBatchItemWriter<Person> writer) throws Exception 
        return stepBuilderFactory.get("step1")
            .<Person, Person> chunk(10)
            .reader(reader())
            .processor(processor())
            .writer(writer).repository(getJobRepo())
            .build();
    
    
     @Bean
    public Job job( @Qualifier("step1") Step step1) throws Exception 
        return jobBuilder.get("myJob").start(step1).repository(getJobRepo()).build();
    


如何解决上述问题?

【问题讨论】:

【参考方案1】:

对于非 Spring Boot 设置:


在批处理配置中声明数据源 bean 时会出现此错误。为了解决这个问题,我添加了一个嵌入式数据源,因为我不想在应用程序数据库中创建这些表:
@Bean
public DataSource mysqlDataSource() 
  // create your application datasource here


@Bean
@Primary
public DataSource batchEmbeddedDatasource() 
    // in memory datasource required by spring batch
    EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
    return builder.setType(EmbeddedDatabaseType.H2)
            .addScript("classpath:schema-drop-h2.sql")
            .addScript("classpath:schema-h2.sql")
            .build();

初始化脚本可以在 org.springframework.batch.core 包下的 spring-batch-core-xxx.jar 中找到。注意我使用的是内存数据库,但解决方案也有效用于其他数据库系统。

【讨论】:

【参考方案2】:

那些在 CentOS(大多数基于 Unix 的系统)中使用 MySql 数据库遇到同样问题的人。

在 Linux 中表名区分大小写。设置lower_case_table_names=1 解决了这个问题。

查找官方文档here

【讨论】:

【参考方案3】:

如果您使用的是 Sprint 启动 application.properties 中的一个简单属性将解决问题 spring.batch.initialize-schema=总是

【讨论】:

以上方案适用于Spring Boot V2及以上版本。对于 2 之前的 Spring Boot 版本,您可以在您的测试类上使用以下两种(一种是删除模式,一种是在每次测试之前创建它)(在这种情况下,我使用内存数据库中的 h2 进行测试,否则,在jar文件夹中查找写入脚本): \n @Sql("classpath:org/springframework/batch/core/schema-drop-h2.sql") @Sql("classpath:org/springframework/batch /core/schema-h2.sql") spring.batch.initialize-schema 在 Spring Boot 2.5 中已弃用。请改用spring.batch.jdbc.initialize-schema = ALWAYS

以上是关于我收到错误表'test.batch_job_instance'不存在的主要内容,如果未能解决你的问题,请参考以下文章

为啥我收到错误:插入表时列中有空值?

我收到以下错误:无法重新打开表:'t1'错误。请协助

为啥我在此 SQL Server 内联表值函数上收到 11555 错误?

“无法获取表元数据”“从 NDBCLUSTER 收到错误 157‘未知错误代码’”

我收到错误表'test.batch_job_instance'不存在

创建表并收到错误,因为 ora 00907 缺少右括号