SpringBoot+MybatisPlus+Druid 配置多数据源

项目上要用到多数据源,发现MybatisPlus从配置到切换数据源有一套快捷的实现,便选用了MybatisPlus的多数据源配置
本文的 dynamic-datasource-spring-boot-starter 与 mybatis-plus-boot-starter 依赖版本均为3.3.1

1. 引入依赖
<!-- MybatisPlus 多数据源自动装配 -->
<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
  <version>${version}</version>
</dependency>

<!-- Druid自动装配 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.21</version>
</dependency>
2. 排除掉Druid原生的自动装配

druid-spring-boot-starterDruidDataSourceAutoConfigure 会自动尝试装配数据源,不排除的话,由于配置结构不同,启动的时候会装配失败报错

@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class)
public class DemoApplication {
  public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args);
  }
}

较新版本的SpringBoot还支持通过配置排除

spring:
  autoconfigure:
    exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
3. 配置数据源
  1. Druid相关配置参照:Druid配置

  2. MybatisPlus 官方配置说明,不过说明有些简陋:MyBatisPlus+Druid配置

  3. 配置示例:

    # druid 数据源配置
    spring:
      datasource:
        dynamic:
          # 设置默认的数据源或者数据源组,默认值即为master
          primary: master 
          # 设置严格模式,默认false不启动. 启动后在未匹配到指定数据源时候会抛出异常,不启动则使用默认数据源.
          strict: false 
          datasource:
            master:
              url: jdbc:oracle:thin:@localhost:1521:fintest
              username: admin
              password: admin
              driver-class-name: oracle.jdbc.OracleDriver
              druid:
                filter: stat,wall
                # 启用ConfigFilter
                config:
                  enabled: true
                stat:
                  enabled: true
                  # 慢SQL记录
                  log-slow-sql: true
                  slow-sql-millis: 30000
                  merge-sql: false
                wall:
                  function-check: false
                  strict-syntax-check: false
                  multi-statement-allow: true
            ebs:
              url: jdbc:oracle:thin:@//localhost:1551/EBS
              username: ebs_reader
              password: ebs_reader
              driver-class-name: oracle.jdbc.OracleDriver
              # Druid个性化配置
              druid:
                filter: stat,wall
                # 启用ConfigFilter
                config:
                  enabled: true
                stat:
                  enabled: true
                  # 慢SQL记录
                  log-slow-sql: true
                  slow-sql-millis: 2000
                  merge-sql: false
                wall:
                  function-check: false
                  strict-syntax-check: false
                  multi-statement-allow: true
            test:
              url: jdbc:oracle:thin:@//localhost:1551/EBS
              username: ebs_reader
              password: ebs_reader
              driver-class-name: oracle.jdbc.OracleDriver
          druid:
            # 初始连接数
            initialSize: 10
            # 最小连接池数量
            minIdle: 20
            # 最大连接池数量
            maxActive: 50
            # 配置获取连接等待超时的时间,单位毫秒
            maxWait: 30000
            #sql  查询超时
            queryTimeout: 1200
            #执行一个事务的超时时间(秒)
            transactionQueryTimeout: 1200
            #SQL 查询验证超时时间(秒),小于或等于 0 的数值表示禁用
            validationQueryTimeout: 20
            #设置是否保持连接活动心跳检测
            keepAlive: true
            # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
            timeBetweenEvictionRunsMillis: 10000
            # 配置一个连接在池中最小生存的时间,单位是毫秒
            minEvictableIdleTimeMillis: 300000
            # 配置一个连接在池中最大生存的时间,单位是毫秒
            maxEvictableIdleTimeMillis: 600000
            #标记是否删除泄露的连接,如果连接超出removeAbandonedTimeout的限制,且该属性设置为 true,则连接被认为是被泄露并且可以被删除
            removeAbandoned: true
            #泄露的连接可以被删除的超时时间(秒),该值应设置为应用程序查询可能执行的最长时间
            removeAbandonedTimeout: 1200
            # 配置检测连接是否有效执行SQL
            validationQuery: SELECT 1 FROM DUAL
            testWhileIdle: true
            testOnBorrow: true
            testOnReturn: false
             # webStatFilter 与 statViewServlet 为Druid配置,但是MybatisPlus未将这两个配置映射进去,故而不生效
             # webStatFilter:
             #   enabled: true
             # # http://localhost:8008/druid/login.html
             # statViewServlet:
             #   enabled: true
             #   loginUsername: dms
             #   loginPassword: dms
    
4. 程序切换数据源

MybatisPlus提供了AOP进行数据源的切换,使用 @DS 注解完成,以上面配置为例,不使用注解时默认为 master 数据源

// 整个类切换为 ebs 数据源,会被方法注解覆盖
@Service
@DS("ebs")
public class DemoServiceImpl implements DemoService {

  private final JdbcTemplate jdbcTemplate;

  @Override
  public List ebsSelect() {
    return  jdbcTemplate.queryForList("SELECT 1 FROM DUAL");
  }
  
  // 切换为 test 方法注解优先级比类注解高
  @Override
  @DS("test")
  public List testSelect() {
    return  jdbcTemplate.queryForList("SELECT 1 FROM DUAL");
  }
}
5. 配置踩坑

MybatisPlus里的Druid配置会因为版本问题,与Druid有细微的差异,如果是照搬老项目的Druid配置出了问题,最好检查下配置的结构对照关系。

可查看 com.baomidou.dynamic.datasource.spring.boot.autoconfigure.druid.DruidConfig 类的结构和处理逻辑。

新项目照搬老项目的Druid配置,因为 filter 和 wall 的配置结构变更,导致部分SQL检查没关闭,部分Oracle方言执行报错,找了半天

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值