SpringBoot+MybatisPlus+Druid 配置多数据源

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

1. 引入依赖


<dependency>
  <groupId>com.baomidougroupId>
  <artifactId>dynamic-datasource-spring-boot-starterartifactId>
  <version>${version}version>
dependency>


<dependency>
    <groupId>com.alibabagroupId>
    <artifactId>druid-spring-boot-starterartifactId>
    <version>1.1.21version>
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方言执行报错,找了半天

你可能感兴趣的:(代码笔记,spring,boot,mybatis,java)