到目前为止,我一直在使用带有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文件中。但是,我仍然遇到错误。我将不胜感激。
答案 0 :(得分:0)
我自己能解决这个问题。最终,我需要独立于实际目标关系数据库的Spring Batch存储库。所以我找到了这个参考:
我能够从该示例中获取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; }
}
完成上述所有操作后,错误消失并且一切正常。