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

如何在Spring Data JDBC中配置多数据源?(替换JdbcTemplate场景)

Hey,刚好有过Spring Data JDBC多数据源配置的实战经验,给你一步步拆解怎么弄——其实核心思路和JdbcTemplate多数据源类似,但要注意Spring Data JDBC的Repository和数据源的绑定逻辑,具体步骤如下:

Spring Data JDBC 多数据源配置指南

1. 先在配置文件里定义多数据源信息

首先在application.properties(或者application.yml)里把两个数据源的连接信息配置好,比如:

# 主库数据源
spring.datasource.primary.url=jdbc:mysql://localhost:3306/main_db
spring.datasource.primary.username=root
spring.datasource.primary.password=your_password
spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver

# 业务库数据源
spring.datasource.secondary.url=jdbc:mysql://localhost:3306/biz_db
spring.datasource.secondary.username=root
spring.datasource.secondary.password=your_password
spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver

2. 编写数据源专属配置类,绑定Repository与数据源

这一步是核心!我们要为每个数据源单独创建配置类,通过@EnableJdbcRepositories注解指定对应Repository的包路径,以及绑定的JdbcTemplate实例。

主库配置类

@Configuration
@EnableJdbcRepositories(
        basePackages = "com.yourproject.repository.primary", // 主库Repository所在包
        jdbcOperationsRef = "primaryJdbcTemplate",
        namedParameterJdbcOperationsRef = "primaryNamedJdbcTemplate"
)
public class PrimaryDataSourceConfig {

    // 加载主库数据源配置
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.primary")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    // 主库专属JdbcTemplate
    @Bean(name = "primaryJdbcTemplate")
    public JdbcTemplate primaryJdbcTemplate(@Qualifier("primaryDataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

    // 主库专属NamedParameterJdbcTemplate(Spring Data JDBC会用到)
    @Bean(name = "primaryNamedJdbcTemplate")
    public NamedParameterJdbcTemplate primaryNamedJdbcTemplate(@Qualifier("primaryDataSource") DataSource dataSource) {
        return new NamedParameterJdbcTemplate(dataSource);
    }
}

业务库配置类

@Configuration
@EnableJdbcRepositories(
        basePackages = "com.yourproject.repository.secondary", // 业务库Repository所在包
        jdbcOperationsRef = "secondaryJdbcTemplate",
        namedParameterJdbcOperationsRef = "secondaryNamedJdbcTemplate"
)
public class SecondaryDataSourceConfig {

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.secondary")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "secondaryJdbcTemplate")
    public JdbcTemplate secondaryJdbcTemplate(@Qualifier("secondaryDataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

    @Bean(name = "secondaryNamedJdbcTemplate")
    public NamedParameterJdbcTemplate secondaryNamedJdbcTemplate(@Qualifier("secondaryDataSource") DataSource dataSource) {
        return new NamedParameterJdbcTemplate(dataSource);
    }
}

敲黑板:@EnableJdbcRepositories的basePackages一定要准确,Spring会自动把该包下的Repository绑定到指定的JdbcTemplate,也就是对应数据源上。

3. 划分Repository和实体类的包结构

为了避免混淆,建议把不同数据源对应的实体类和Repository分开到不同包下:

  • com.yourproject.entity.primary:主库实体类(比如User.java)
  • com.yourproject.repository.primary:主库Repository(比如UserRepository.java,继承CrudRepository或JdbcRepository)
  • com.yourproject.entity.secondary:业务库实体类(比如Order.java)
  • com.yourproject.repository.secondary:业务库Repository(比如OrderRepository.java)

举个Repository的例子:

// 主库Repository
public interface UserRepository extends CrudRepository<User, Long> {
    // 自定义查询方法
    List<User> findByUsername(String username);
}

4. 业务层使用不同数据源的Repository

在Service里直接注入对应的Repository即可,Spring会自动帮你绑定到正确的数据源:

@Service
public class UserService {
    private final UserRepository userRepository;

    // 构造注入(推荐)
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public List<User> getUsersByName(String username) {
        return userRepository.findByUsername(username);
    }
}
@Service
public class OrderService {
    private final OrderRepository orderRepository;

    public OrderService(OrderRepository orderRepository) {
        this.orderRepository = orderRepository;
    }

    public Order getOrderById(Long id) {
        return orderRepository.findById(id).orElse(null);
    }
}

额外注意事项

  • 排除自动配置的数据源:为了避免Spring自动创建默认数据源导致冲突,记得在启动类上加上@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})。
  • 事务管理:如果需要事务,要为每个数据源配置对应的事务管理器,比如在主库配置类里添加:
@Bean(name = "primaryTransactionManager")
public DataSourceTransactionManager primaryTransactionManager(@Qualifier("primaryDataSource") DataSource dataSource) {
    return new DataSourceTransactionManager(dataSource);
}

然后在需要事务的Service方法上指定事务管理器:@Transactional("primaryTransactionManager")。

内容的提问来源于stack exchange,提问作者tkmknr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:58:10