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