Spring Boot/Spring Batch:使用和配置两个数据源通过应用程序属性

发布于 2025-01-28 18:55:27 字数 3033 浏览 4 评论 0原文

我正在使用Spring Boot/Spring Batch,需要提供两个JDBC数据源。

我找不到一种从我的application.properties自动加载配置参数的方法。

//BatchConfiguration which uses both Data Sources:
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {

  @Bean
  public JdbcBatchItemWriter<Customer> writer(@Qualifier("dataSourceOne") DataSource dataSource) {
    return new JdbcBatchItemWriterBuilder<Customer>()
            .itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())
            .sql("..."))
            .dataSource(dataSource)
            .build();
  }
@Bean
  public JdbcCursorItemReader<Customer> reader(@Qualifier("dataSourceTwo") DataSource dataSource) {
    return new JdbcCursorItemReaderBuilder<Customer>()
            .dataSource(dataSource)
            .name("myItemReader")
            .sql("...")
            .rowMapper(new CustomerRowMapper())
            .build();
  }

上面的代码可与以下配置一起使用,该配置直接提供了数据源:

//WORKING SOLUTION
@Configuration(proxyBeanMethods = false)
public class DataSourcesConfiguration {

  @Bean("dataSourceOne")
  @Primary
  public DataSource dataSource() {
    DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
    dataSourceBuilder.url("jdbc:h2:mem:AAA-h2");
    dataSourceBuilder.username("AAA");
    dataSourceBuilder.password("AAA");
    dataSourceBuilder.driverClassName("org.h2.Driver");
    return dataSourceBuilder.build();
  }

  @Bean("dataSourceTwo")
  public DataSource dataSourceTwo() {
    DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
    dataSourceBuilder.url("jdbc:oracle:thin:@AAA");
    dataSourceBuilder.username("AAA");
    dataSourceBuilder.password("AAA");
    dataSourceBuilder.driverClassName("oracle.jdbc.driver.OracleDriver");
    return dataSourceBuilder.build();
  }
}

我尝试通过注释从我的应用程序属性创建数据源@configurationProperties

//NOT WORKING
@Configuration(proxyBeanMethods = false)
public class DataSourcesConfiguration {
  @Bean("dataSourceOne")
  @Primary
  @ConfigurationProperties(prefix="data1.datasource")
  public DataSource dataSource() {
    return DataSourceBuilder.create().build();
  }

  @Bean("dataSourceTwo")
  @ConfigurationProperties(prefix="data2.datasource")
  public DataSource dataSourceTwo() {
    return DataSourceBuilder.create().build();
  }
}

如果

data1.datasource.url=jdbc:h2:mem:AAA-h2
data1.datasource.username=AAA
data1.datasource.password=AAA
data1.datasource.driverClassName=org.h2.Driver

data2.datasource.url=jdbc:oracle:thin:@AAA
data2.datasource.username=AAA
data2.datasource.password=AAA
data2.datasource.driverClassName=oracle.jdbc.driver.OracleDriver

错误无法在非工作版本中检测数据库类型

如何通过我的application.properties中的属性正确配置并通过我的属性提供数据源?

I'm working with Spring Boot/Spring Batch, and need to provide two jdbc Data Sources.

I can't find a way to automatically load the config parameters from my application.properties.

//BatchConfiguration which uses both Data Sources:
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {

  @Bean
  public JdbcBatchItemWriter<Customer> writer(@Qualifier("dataSourceOne") DataSource dataSource) {
    return new JdbcBatchItemWriterBuilder<Customer>()
            .itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())
            .sql("..."))
            .dataSource(dataSource)
            .build();
  }
@Bean
  public JdbcCursorItemReader<Customer> reader(@Qualifier("dataSourceTwo") DataSource dataSource) {
    return new JdbcCursorItemReaderBuilder<Customer>()
            .dataSource(dataSource)
            .name("myItemReader")
            .sql("...")
            .rowMapper(new CustomerRowMapper())
            .build();
  }

Above code works with the following Configuration, which has the DataSource provided directly:

//WORKING SOLUTION
@Configuration(proxyBeanMethods = false)
public class DataSourcesConfiguration {

  @Bean("dataSourceOne")
  @Primary
  public DataSource dataSource() {
    DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
    dataSourceBuilder.url("jdbc:h2:mem:AAA-h2");
    dataSourceBuilder.username("AAA");
    dataSourceBuilder.password("AAA");
    dataSourceBuilder.driverClassName("org.h2.Driver");
    return dataSourceBuilder.build();
  }

  @Bean("dataSourceTwo")
  public DataSource dataSourceTwo() {
    DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
    dataSourceBuilder.url("jdbc:oracle:thin:@AAA");
    dataSourceBuilder.username("AAA");
    dataSourceBuilder.password("AAA");
    dataSourceBuilder.driverClassName("oracle.jdbc.driver.OracleDriver");
    return dataSourceBuilder.build();
  }
}

Now if I try to create the DataSource from my application properties via annotation @ConfigurationProperties, it will not work:

//NOT WORKING
@Configuration(proxyBeanMethods = false)
public class DataSourcesConfiguration {
  @Bean("dataSourceOne")
  @Primary
  @ConfigurationProperties(prefix="data1.datasource")
  public DataSource dataSource() {
    return DataSourceBuilder.create().build();
  }

  @Bean("dataSourceTwo")
  @ConfigurationProperties(prefix="data2.datasource")
  public DataSource dataSourceTwo() {
    return DataSourceBuilder.create().build();
  }
}

application.properties:

data1.datasource.url=jdbc:h2:mem:AAA-h2
data1.datasource.username=AAA
data1.datasource.password=AAA
data1.datasource.driverClassName=org.h2.Driver

data2.datasource.url=jdbc:oracle:thin:@AAA
data2.datasource.username=AAA
data2.datasource.password=AAA
data2.datasource.driverClassName=oracle.jdbc.driver.OracleDriver

I receive the error Unable to detect database type in the non working version.

How can I correctly configure and provide a DataSource through my properties in application.properties?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

夏夜暖风 2025-02-04 18:55:27

创建dataSource用于创建的值实际上是其他类datasourceproperties的一部分。
您还可以使用它来创建dataSource

以下是来自 taskdbconfig (如果您需要更多功能,此类还包含信息)。

import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import com.zaxxer.hikari.HikariDataSource;

    @Bean
    @ConfigurationProperties("data1.datasource")
    public DataSourceProperties data1DataSourceProperties() {
        return new DataSourceProperties();
    }
        
    @Bean
    @ConfigurationProperties("data1.datasource.hikari")
    public HikariDataSource data1DataSource() {
    
        // Different types are documented at
        // https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/jdbc/DataSourceBuilder.html
        
        return data1DataSourceProperties().initializeDataSourceBuilder()
            .type(HikariDataSource.class).build();
    }

application.yml

data1.datasource.platform: h2
data1.datasource.url: 'jdbc:h2:mem:test'

# Hikari config properties: https://github.com/brettwooldridge/HikariCP#configuration-knobs-baby
data1.datasource.hikari.minimumIdle: 1
data1.datasource.hikari.maximumPoolSize: 4

The values to use in creating a DataSource are actually part of another class DataSourceProperties
which you can also use to create a DataSource.

Following is a snippet from TaskDbConfig (this class also contains information if you need more functions).

import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import com.zaxxer.hikari.HikariDataSource;

    @Bean
    @ConfigurationProperties("data1.datasource")
    public DataSourceProperties data1DataSourceProperties() {
        return new DataSourceProperties();
    }
        
    @Bean
    @ConfigurationProperties("data1.datasource.hikari")
    public HikariDataSource data1DataSource() {
    
        // Different types are documented at
        // https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/jdbc/DataSourceBuilder.html
        
        return data1DataSourceProperties().initializeDataSourceBuilder()
            .type(HikariDataSource.class).build();
    }

application.yml

data1.datasource.platform: h2
data1.datasource.url: 'jdbc:h2:mem:test'

# Hikari config properties: https://github.com/brettwooldridge/HikariCP#configuration-knobs-baby
data1.datasource.hikari.minimumIdle: 1
data1.datasource.hikari.maximumPoolSize: 4
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文