不同模式中的Spring批处理表

时间:2017-10-31 15:56:19

标签: schema spring-batch

我想使用不同的模式来保存Spring Batch表。我可以在JobRepositoryFactoryBean中看到我的新数据源。但是这些表仍然是在我有业务表的其他shcema中创建的。我读到soemwhere我可以使用dataSource.setValidationQuery来改变架构,但仍然不起作用。我可以解决这个问题。以下是JobRepositoryFactoryBeanDatasource道具。

 @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());

3 个答案:

答案 0 :(得分:1)

使用Spring Batch' @EnableBatchProcessing时,Spring Batch表使用的DataSourceBatchConfigurer提供的DataSource。如果您在应用程序中使用多个BatchConfigurer,则必须创建您自己的DefaultBatchConfigurer(通过扩展.add_picture()或实现接口)以便Spring批处理知道要使用哪个。您可以在参考文档中阅读有关此自定义的更多信息:https://docs.spring.io/spring-batch/4.0.x/reference/html/job.html#configuringJobRepository

答案 1 :(得分:0)

复制现有数据源属性,并覆盖BatchConfigurer以返回此新数据源。然后,在新数据源的属性中,更改

  1. 用户使用默认模式连接到数据库,该默认模式定义为Spring Batch表的所需模式

  2. 用于包含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

在连接URL中指定架构。

对于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>