【多数据源】多数据源不生效原因排查
2025-12-24
JAVA
00

目录

1、使用方法
2、使用
1. 标注在Mapper/Service接口上(整个接口使用指定数据源)
2. 标注在Mapper/Service方法上(精准控制单个方法)
3、注意事项
1、避免与事务冲突
2、数据源名称必须配置正确
3、排除扫描问题

记录一下多数据源使用以及配置方法和注意事项

1、使用方法

展开代码
<!--多数据源--> <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>3.6.1</version> </dependency>

配置文件:

展开代码
spring: datasource: dynamic: primary: master #设置默认的数据源或者数据源组,默认值即为master strict: false #设置严格模式,默认false不启动. 启动后在未匹配到指定数据源时候会抛出异常,不启动则使用默认数据源. datasource: master: type: com.zaxxer.hikari.HikariDataSource url: jdbc:mysql://xxxx:3306/xx?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&characterEncoding=UTF8&useSSL=false&allowMultiQueries=true&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true username: xx password: xxxxxxx driver-class-name: com.mysql.cj.jdbc.Driver hikari: max-lifetime: 0 salve: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver username: xx password: xxxxxx url: jdbc:mysql://xxxx:xx/xx?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&characterEncoding=UTF8&useSSL=false&allowMultiQueries=true&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true hikari: max-lifetime: 1800000

2、使用

1. 标注在Mapper/Service接口上(整个接口使用指定数据源)

展开代码
// 所有该Mapper的方法都使用 "slave" 数据源 @DS("slave") @Mapper public interface UserMapper { // 查询方法:使用slave数据源 List<User> listUsers(); // 新增方法:也会使用slave数据源(若需切换可单独注解) int insertUser(User user); }

2. 标注在Mapper/Service方法上(精准控制单个方法)

展开代码
@Mapper public interface UserMapper { // 查:使用slave数据源 @DS("slave") List<User> listUsers(); // 增:使用master数据源 @DS("master") int insertUser(User user); }

优先级:方法@DS > 类@DS > 全局默认数据源

3、注意事项

1、避免与事务冲突

  • 如果 Mapper 方法被 @Transactional 注解的 Service 方法包裹,数据源切换必须在事务开启前完成;
  • 事务内切换数据源不生效(因为事务一旦开启,数据源就固定了),因此建议:
  1. 若事务内需要多数据源操作,拆分到不同事务方法;
  2. 优先在 Service 层(事务外)标注 @DS,或直接在 Mapper 层标注(确保切换在事务前)。

2、数据源名称必须配置正确

3、排除扫描问题

确保 Mapper 接口被 Spring 扫描到(通过 @Mapper 或 @MapperScan),否则注解无法被解析。

本文作者:刘涛

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!