Skip to main content
Advertisement

8.3 Java Configuration and Multi-DataSource Setup

Learn how to manually configure a DataSource using Java code when bypassing Spring Boot's Auto-Configuration, and how to connect to two or more databases within a single application.

1. Manual DataSource Configuration via Java

Using Java configuration classes is useful for compatibility with specific libraries or when settings need to be changed dynamically at runtime.

@Configuration
public class DataSourceConfig {

@Bean
@ConfigurationProperties("spring.datasource.hikari") // Bind settings from yml
public DataSource dataSource() {
// Create manually using DataSourceBuilder
return DataSourceBuilder.create()
.type(HikariDataSource.class)
.build();
}
}

2. Multi-DataSource Configuration

This is used when connecting to different databases simultaneously (e.g., MySQL and PostgreSQL) or when separating Read-only (Slave) and Write-only (Master) databases.

2.1 application.yml Setup

Define unique prefixes to distinguish between the data sources.

spring:
datasource:
# Primary Database (Main)
main:
jdbc-url: jdbc:mysql://localhost:3306/main_db
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver

# Secondary Database (Sub)
sub:
jdbc-url: jdbc:postgresql://localhost:5432/sub_db
username: user
password: password
driver-class-name: org.postgresql.Driver

2.2 Java Configuration Implementation

Use @Primary and @Qualifier properly to prevent bean conflicts.

@Configuration
public class MultiDataSourceConfig {

// Main DataSource
@Primary
@Bean(name = "mainDataSource")
@ConfigurationProperties("spring.datasource.main")
public DataSource mainDataSource() {
return DataSourceBuilder.create().type(HikariDataSource.class).build();
}

// Sub DataSource
@Bean(name = "subDataSource")
@ConfigurationProperties("spring.datasource.sub")
public DataSource subDataSource() {
return DataSourceBuilder.create().type(HikariDataSource.class).build();
}

// Specify Qualifier when using JdbcTemplate
@Bean
public JdbcTemplate mainJdbcTemplate(@Qualifier("mainDataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}

@Bean
public JdbcTemplate subJdbcTemplate(@Qualifier("subDataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}

3. Practical Tips and Considerations

  1. Mandatory @Primary: If multiple beans of the same type exist, you must specify which one Spring should inject by default to avoid errors.
  2. ConfigurationProperties Note: In Spring Boot 2.x and later, when binding Hikari settings directly, you often need to use jdbc-url instead of url in your property names.
  3. Transaction Managers: When using multi-DB setups, you should also register separate Transaction Managers (PlatformTransactionManager) and specify them where needed (e.g., @Transactional("mainTransactionManager")).
Advertisement