'Spring Boot/Spring Batch: Using and configuring two DataSource via app 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?



Solution 1:[1]

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

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 vanOekel