@DS注解方式springboot多数据源配置及失效场景解决
1.使用教程
导入依赖
<!--多数据源-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.0</version>
</dependency>
123456
配置数据源
datasource:
dynamic:
# 主数据源位master
primary: master
strict: false
datasource:
master:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://172.16.5.10:3306/master?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
username: master
password: master
type: com.alibaba.druid.pool.DruidDataSource
druid:
initial-size: 20
min-idle: 20
max-active: 100
max-wait: 60000
pool-prepared-statements: false
max-pool-prepared-statement-per-connection-size: 20
timeBetweenEvictionRunsMillis: 60000
validationQuery: SELECT 1 FROM dual
filter: stat,wall,log4j
slave:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://172.16.5.69:3306/slave?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
username: slave
password: slave
type: com.alibaba.druid.pool.DruidDataSource
druid:
initial-size: 20
min-idle: 20
max-active: 100
max-wait: 60000
pool-prepared-statements: false
max-pool-prepared-statement-per-connection-size: 20
timeBetweenEvictionRunsMillis: 60000
validationQuery: SELECT 1 FROM dual
filter: stat,wall,log4j
#mybatis-plus
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true
mapper-locations: classpath*:/mapper/**/*mapper.xml
type-aliases-package: com.byyl.datacenter.entity
global-config:
db-config:
logic-delete-field: deleted # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
使用方式
再service具体实现类或者方法上添加 @DS("slave“) 即可切换数据源【slave为配置文件里配置的数据源名称】
失效场景解决方案
使用动态数据源(@DS)时,@Transactional使用可能会照成@DS失效。
解决方案:
- 1.去掉事务(不建议)
- 2.@DS切换数据源的方法添加事务传播属性@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
- 3.去掉@DS切换数据源方法的事务,主方法用@DSTransactional注解。
@DS注解加到mapper接口、service接口、service方法里都不生效
解决方案:
- 添加到service实现类或者实现类里具体的方法上。
在同一个实现类中,一个非DS注解的常规方法里调用@DS注解的方法可能失效
解决方案:
- 将该DS注解方法定义在不同的类中,通过bean注入的方式调用