@DS注解方式springboot多数据源配置及失效场景解决

1.使用教程

导入依赖

<!--多数据源-->
		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
			<version>3.5.0</version>
		</dependency>

配置数据源

  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)

使用方式

再service具体实现类或者方法上添加 @DS("slave“) 即可切换数据源【slave为配置文件里配置的数据源名称】
@DS注解方式springboot多数据源配置及失效场景解决_第1张图片

失效场景解决方案

使用动态数据源(@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注入的方式调用

你可能感兴趣的:(踩坑,spring,boot,后端,java)