我想使用不同的模式来保存Spring Batch表。我可以在JobRepositoryFactoryBean
中看到我的新数据源。但是这些表仍然是在我有业务表的其他shcema中创建的。我读到soemwhere我可以使用dataSource.setValidationQuery
来改变架构,但仍然不起作用。我可以解决这个问题。以下是JobRepositoryFactoryBean
和Datasource
道具。
@Bean
@Qualifier("batchDataSource")
protected JobRepository createJobRepository() throws Exception {
JobRepositoryFactoryBean factory = createJobRepositoryFactoryBean();
factory.setDataSource(getDataSource());
if (getDbType() != null) {
factory.setDatabaseType(getDbType());
}
factory.setTransactionManager(getTransactionManager());
factory.setIsolationLevelForCreate(getIsolationLevel());
factory.setMaxVarCharLength(maxVarCharLength);
factory.setTablePrefix(getTablePrefix());
factory.setValidateTransactionState(validateTransactionState);
factory.afterPropertiesSet();
return factory.getObject();
}
spring.datasource.url=url
spring.datasource.username=username
spring.datasource.password=pwd
spring.datasource.driver-class-name:oracle.jdbc.driver.OracleDriver
spring.datasource.validation-query=ALTER SESSION SET
CURRENT_SCHEMA=schemaname
#batch setting
spring.batch.datasource.url=burl
spring.batch.datasource.username=busername
spring.batch.datasource.password=bpwd
spring.batch.datasource.driver-class-name:oracle.jdbc.driver.OracleDriver
spring.batch.datasource.validation-query=ALTER SESSION SET
CURRENT_SCHEMA=batchschema
org.apache.tomcat.jdbc.pool.DataSource dataSource = new org.apache.tomcat.jdbc.pool.DataSource();
dataSource.setName("batchDataSourceName");
dataSource.setDriverClassName(batchDataSourceProperties.getDriverClassName());
dataSource.setUrl(batchDataSourceProperties.getUrl());
dataSource.setUsername(batchDataSourceProperties.getUsername());
dataSource.setPassword(batchDataSourceProperties.getPassword());
// dataSource.setValidationQuery(batchDataSourceProperties.getValidationQuery());
答案 0 :(得分:1)
使用Spring Batch' @EnableBatchProcessing
时,Spring Batch表使用的DataSource
是BatchConfigurer
提供的DataSource
。如果您在应用程序中使用多个BatchConfigurer
,则必须创建您自己的DefaultBatchConfigurer
(通过扩展.add_picture()
或实现接口)以便Spring批处理知道要使用哪个。您可以在参考文档中阅读有关此自定义的更多信息:https://docs.spring.io/spring-batch/4.0.x/reference/html/job.html#configuringJobRepository
答案 1 :(得分:0)
复制现有数据源属性,并覆盖BatchConfigurer以返回此新数据源。然后,在新数据源的属性中,更改
用户使用默认模式连接到数据库,该默认模式定义为Spring Batch表的所需模式
用于包含Spring Batch表所需架构的连接URL。
您选择的选项将取决于您的数据库类型,如下所示:
对于SQL Server,您可以为用于连接数据库的用户定义默认架构(我是一个)。
CREATE SCHEMA batchschema;
USE database;
CREATE USER batchuser;
GRANT CREATE TABLE TO batchuser;
ALTER USER batchuser WITH DEFAULT_SCHEMA = batchschema;
ALTER AUTHORIZATION ON SCHEMA::batchschema TO batchuser;
对于Postgres 9.4,您可以使用currentSchema参数在连接URL中指定模式:jdbc:postgresql://host:port/db?currentSchema=batch
对于9.4之前的Postgres,您可以使用searchpath参数:jdbc:postgresql://host:port/db?searchpath=batch
对于Oracle来说,似乎需要在会话上设置架构。我不确定这将如何工作...
ALTER SESSION SET CURRENT_SCHEMA batchschema
限定每个数据源,将要用于批处理表的数据源设置为@Primary,然后为DefaultBatchConfigurer设置数据源,如下所示:
@Bean(name="otherDataSource")
public DataSource otherDataSource() {
//...
}
@Primary
@Bean(name="batchDataSource")
public DataSource batchDataSource() {
//...
}
@Bean
BatchConfigurer configurer(@Qualifier("batchDataSource") DataSource dataSource){
return new DefaultBatchConfigurer(dataSource);
}
答案 2 :(得分:0)
application.properties 中的以下属性对我有用。这将在数据库的new_schema下创建元模式表。
spring.batch.tablePrefix=new_schema.BATCH_
以下是我正在使用的springBoot版本。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>