Spring 批处理:在内存数据库中用于 spring 批处理元数据表

Spring Batch : use in memory database for spring batch metadata tables

我正在使用 spring 批处理从 Oracle 数据库读取数据并将结果写入 CSV 文件。

我还需要将 spring 批处理元数据表与 oracle 数据库分开,为此,我在批处理配置中配置了两个不同的数据源(spring 的内存数据库)批处理元数据)。

这是我的代码:

BatchConfiguration.java

@Configuration
@EnableBatchProcessing
@EnableScheduling
public class BatchConfiguration {

  @Autowired
  public JobBuilderFactory jobBuilderFactory;

  @Autowired
  public StepBuilderFactory stepBuilderFactory;    


  @Bean
  @Qualifier("businessDataSource")
  @ConfigurationProperties(prefix = "spring.business.datasource")
  public DataSource primaryDataSource() {
    return DataSourceBuilder.create().build();
  }

  @Bean
  @Primary
  @Qualifier("metadataDataSource")
  @ConfigurationProperties(prefix = "spring.metadata.datasource")
  public DataSource secondaryDataSource() {
    return DataSourceBuilder.create().build();
  }
}

然后我的 itemReader bean 看起来像:

@Bean
public ItemReader<Person> reader(@Qualifier("businessDataSource") DataSource dataSource) {
  .....
}

当我 运行 我的 Batch 时,一切正常。

但是当我尝试在我的 BatchApplication.java 中添加 JobLauncher 和 Job bean 时,如下所示:

@Autowired
private JobLauncher jobLauncher;

@Autowired
private Job job;

该批次正在尝试将元数据库用于我的业务数据库:

Caused by: org.springframework.jdbc.BadSqlGrammarException: Executing query; bad SQL grammar

我的代码有问题吗?

非常感谢

终于有解决方案了

我的 reader bean 是:

@Bean
public ItemReader<Person> reader(@Qualifier("businessDataSource") DataSource dataSource) {
  databaseReader.setDataSource(datasource);
   ....
}

然后我将其更改为(现在可以使用了)

@Bean
  public ItemReader<Person> reader() {
    JdbcCursorItemReader<Person> databaseReader = new JdbcCursorItemReader<>();
    databaseReader.setDataSource(primaryDataSource());
    ....
  }