You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:38:13