Spring Batch-连接到Postgres数据库的问题

时间:2020-08-24 20:15:07

标签: java postgresql spring-batch

到目前为止,我一直在使用带有Spring Batch的内存H2 DB。但是,现在我切换到连接到外部postgres DB。这是我的连接对象(有些混淆):

@Bean
public DataSource postgresDatasource() {
    DriverManagerDataSource datasource = new DriverManagerDataSource();
    datasource.setDriverClassName("org.postgresql.Driver");
    datasource.setUrl("jdbc:postgresql://x.x.x.x:xxxx/blah");
    datasource.setUsername("Joe");
    datasource.setPassword("password");
    return datasource;
}

启动应用程序时,我得到:

由以下原因引起:org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback;错误的SQL语法[SELECT JOB_INSTANCE_ID, 来自BATCH_JOB_INSTANCE的JOB_NAME,其中JOB_NAME =吗?和JOB_KEY =?]; 嵌套的异常是org.postgresql.util.PSQLException:错误:关系 “ batch_job_instance”不存在

然后我读到Spring Batch使用数据库来保存元数据以恢复/重试功能,而对于嵌入式数据库,这些是Spring Batch默认设置的表。好的,这可以解释为什么我以前从未见过此错误。

但是,它说我可以设置此属性:

spring.batch.initialize-schema=never

所以我把它放在了application.properties文件中。但是,我仍然遇到错误。我将不胜感激。

1 个答案:

答案 0 :(得分:0)

我自己能解决这个问题。最终,我需要独立于实际目标关系数据库的Spring Batch存储库。所以我找到了这个参考:

https://github.com/spring-projects/spring-batch/blob/342d27bc1ed83312bdcd9c0cb30510f4c469e47d/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/annotation/DefaultBatchConfigurer.java#L84

我能够从该示例中获取DefaultBatchConfigurer类,并通过为嵌入式/本地数据源添加@Qualifier来对数据源进行较小的更改:

@Autowired(required = false)
public void setDataSource(@Qualifier("dataSource") DataSource dataSource) {
    this.dataSource = dataSource;
    this.transactionManager = new DataSourceTransactionManager(dataSource);
}

然后,在我的Spring Batch阅读器上(在我的其他批处理配置类中),通过为Postgres数据源添加@Qualifier,对数据源进行了较小的更改:

@Bean
public ItemReader<StuffDto> itemReader(@Qualifier("postgresDataSource")DataSource dataSource) {
return new JdbcCursorItemReaderBuilder<StuffDto>()
    .name("cursorItemReader")
    .dataSource(dataSource)
    .sql(GET_DATA)
    .rowMapper(new BeanPropertyRowMapper<>(StuffDto.class))
    .build();
}

最后(或者首先确实是我第一次做的那样),我明确命名了数据源bean,以便java可以区分它们的用法,如上:

@Configuration
public class PersistenceContext {


    @Bean(name = "dataSource")
    public DataSource dataSource() {
        DriverManagerDataSource datasource = new DriverManagerDataSource();
        datasource.setDriverClassName("org.h2.Driver");
        datasource.setUrl("jdbc:h2:file:/tmp/test");
        datasource.setUsername("sa");
        datasource.setPassword("");
        return datasource;
    }

    @Bean(name = "postgresDataSource")
    public DataSource postgresDatasource() {
        DriverManagerDataSource datasource = new DriverManagerDataSource();
        datasource.setDriverClassName("org.postgresql.Driver");
        datasource.setUrl("jdbc:postgresql://x.x.x.x:xxxx/blah");
        datasource.setUsername("joe");
        datasource.setPassword("password");
        return datasource;    }
}

完成上述所有操作后,错误消失并且一切正常。