Spring Boot中双不同数据源Hikari连接池的配置方法及可行性咨询
当然可以搞定!我之前帮好几个同事配置过Spring Boot里多数据源的Hikari连接池,用application.properties配合几个简单的配置类就能实现,下面一步步给你说清楚:
1. 先在application.properties里配置双数据源的Hikari参数
我们用不同的前缀区分两个数据源,比如primary(主数据源)和secondary(次数据源),把Hikari的专属配置也一起加上:
# 主数据源配置 spring.datasource.primary.url=jdbc:mysql://localhost:3306/db_primary?useSSL=false&serverTimezone=UTC spring.datasource.primary.username=root spring.datasource.primary.password=your_password spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver # 主数据源的Hikari连接池配置 spring.datasource.primary.hikari.maximum-pool-size=10 spring.datasource.primary.hikari.minimum-idle=2 spring.datasource.primary.hikari.connection-timeout=30000 spring.datasource.primary.hikari.idle-timeout=600000 # 次数据源配置 spring.datasource.secondary.url=jdbc:mysql://localhost:3306/db_secondary?useSSL=false&serverTimezone=UTC spring.datasource.secondary.username=root spring.datasource.secondary.password=your_password spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver # 次数据源的Hikari连接池配置 spring.datasource.secondary.hikari.maximum-pool-size=8 spring.datasource.secondary.hikari.minimum-idle=1 spring.datasource.secondary.hikari.connection-timeout=30000 spring.datasource.secondary.hikari.idle-timeout=600000
2. 编写数据源配置类
需要创建两个配置类,分别绑定上面的配置,并且指定主数据源(避免Spring自动装配时冲突):
主数据源配置类
import com.zaxxer.hikari.HikariDataSource; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import javax.sql.DataSource; @Configuration public class PrimaryDataSourceConfig { @Primary @Bean(name = "primaryDataSource") @ConfigurationProperties(prefix = "spring.datasource.primary") public DataSource primaryDataSource() { // Spring Boot会自动把Hikari的配置绑定到这个DataSource里 return new HikariDataSource(); } }
次数据源配置类
import com.zaxxer.hikari.HikariDataSource; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.sql.DataSource; @Configuration public class SecondaryDataSourceConfig { @Bean(name = "secondaryDataSource") @ConfigurationProperties(prefix = "spring.datasource.secondary") public DataSource secondaryDataSource() { return new HikariDataSource(); } }
3. 配置对应的JdbcTemplate(如果需要操作数据库)
如果用JdbcTemplate来操作两个库,需要为每个数据源单独创建JdbcTemplate Bean:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.jdbc.core.JdbcTemplate; import javax.sql.DataSource; @Configuration public class JdbcTemplateConfig { @Primary @Bean(name = "primaryJdbcTemplate") public JdbcTemplate primaryJdbcTemplate(DataSource primaryDataSource) { return new JdbcTemplate(primaryDataSource); } @Bean(name = "secondaryJdbcTemplate") public JdbcTemplate secondaryJdbcTemplate(DataSource secondaryDataSource) { return new JdbcTemplate(secondaryDataSource); } }
4. 使用时指定对应的Bean
在业务代码里,用@Qualifier注解指定要使用哪个JdbcTemplate(或数据源):
import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; @Service public class DataService { private final JdbcTemplate primaryJdbcTemplate; private final JdbcTemplate secondaryJdbcTemplate; // 构造注入,用@Qualifier指定Bean名称 public DataService(@Qualifier("primaryJdbcTemplate") JdbcTemplate primaryJdbcTemplate, @Qualifier("secondaryJdbcTemplate") JdbcTemplate secondaryJdbcTemplate) { this.primaryJdbcTemplate = primaryJdbcTemplate; this.secondaryJdbcTemplate = secondaryJdbcTemplate; } public void queryPrimaryDb() { String sql = "SELECT * FROM users"; primaryJdbcTemplate.query(sql, (rs, rowNum) -> rs.getString("username")); } public void querySecondaryDb() { String sql = "SELECT * FROM orders"; secondaryJdbcTemplate.query(sql, (rs, rowNum) -> rs.getInt("order_id")); } }
注意事项
- 一定要给主数据源加上
@Primary注解,不然Spring不知道该默认用哪个,会抛出歧义错误 @ConfigurationProperties的前缀要和application.properties里的完全对应,这样Hikari的所有配置才会自动绑定- 如果用JPA而不是JdbcTemplate,只需要把JdbcTemplate的配置换成EntityManagerFactory和TransactionManager的配置就行,思路是一样的
内容的提问来源于stack exchange,提问作者gcpdev-guy
相关产品推荐
相关产品推荐

