如何在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
相关产品推荐
相关产品推荐

