1.使用教程
导入依赖
<!--多数据源--><dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.5.0</version></dependency>
123456
配置数据源
datasource:dynamic:# 主数据源位masterprimary: masterstrict: falsedatasource:master:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://172.16.5.10:3306/master?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghaiusername: masterpassword: mastertype: com.alibaba.druid.pool.DruidDataSourcedruid:initial-size: 20min-idle: 20max-active: 100max-wait: 60000pool-prepared-statements: falsemax-pool-prepared-statement-per-connection-size: 20timeBetweenEvictionRunsMillis: 60000validationQuery: SELECT 1 FROM dualfilter: stat,wall,log4jslave:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://172.16.5.69:3306/slave?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghaiusername: slavepassword: slavetype: com.alibaba.druid.pool.DruidDataSourcedruid:initial-size: 20min-idle: 20max-active: 100max-wait: 60000pool-prepared-statements: falsemax-pool-prepared-statement-per-connection-size: 20timeBetweenEvictionRunsMillis: 60000validationQuery: SELECT 1 FROM dualfilter: stat,wall,log4j#mybatis-plus
mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case: truemapper-locations: classpath*:/mapper/**/*mapper.xmltype-aliases-package: com.byyl.datacenter.entityglobal-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注入的方式调用