常规配置(以oracle数据库为例):

spring:
  datasource:
    dynamic:
      datasource:
        master:
          username: master
          password: xxx
          driver-class-name: com.p6spy.engine.spy.P6SpyDriver
          url: jdbc:p6spy:oracle:thin:@ip:1521:orcl
        slave:
          username: slave
          password: xxx
          driver-class-name: com.p6spy.engine.spy.P6SpyDriver
          url: jdbc:p6spy:oracle:thin:@ip:1521:orcl

多数据源hikari数据库连接池配置不生效的情况

在配置hikari数据库连接池的时候遇到了配置不生效的问题,以下是错误的配置方式,hikari配置项和dynamic处于同级,都位于spring.datasource下,以往单数据源的情况下,hikari这样配置没问题。

spring:
  datasource:
    dynamic:
      datasource:
        master:
          username: slave
          password: xxx
          driver-class-name: com.p6spy.engine.spy.P6SpyDriver
          url: jdbc:p6spy:oracle:thin:@ip:1521:orcl
        slave:
          username: slave
          password: xxx
          driver-class-name: com.p6spy.engine.spy.P6SpyDriver
          url: jdbc:p6spy:oracle:thin:@ip:1521:zxdorcl
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      # 自动提交
      auto-commit: true
      connection-test-query: SELECT 1
      # 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 默认:30秒
      connection-timeout: 60000
      # 一个连接idle状态的最大时长(毫秒),超时则被释放(retired),默认:10分钟
      idle-timeout: 300000
      # 一个连接的生命时长(毫秒),超时而且没被使用则被释放(retired),默认:30分钟 1800000ms
      max-lifetime: 1800000
      # 连接池中允许的最大连接数。缺省值:10;
      maximum-pool-size: 15
      # 最小连接数
      minimum-idle: 10
      # 连接池名字
      pool-name: HikariCP

通过开启logging.level.com.zaxxer.hikari=trace启动项目实时关注连接池状态,发现两个数据源的配置都是加载的默认值,说明配置文件的配置不生效:

多数据源下hikari数据库连接池的正确配置如下:

spring:
  datasource:
    dynamic:
      hikari:
        min-idle: 10
        max-pool-size: 15
        connection-timeout: 60000
        idle-timeout: 300000
        max-lifetime: 1800000
        p6spy: true
      datasource:
        master:
          username: master
          password: xxx
          driver-class-name: com.p6spy.engine.spy.P6SpyDriver
          url: jdbc:p6spy:oracle:thin:@ip:1521:orcl
        slave:
          username: slave
          password: xxx
          driver-class-name: com.p6spy.engine.spy.P6SpyDriver
          url: jdbc:p6spy:oracle:thin:@ip:1521:zxdorcl

重启应用查看hikari配置加载信息,可以看到配置是生效了:

 

 @DS注解不生效的几种情况

  1. 进过验证,@DS注解加到mapper接口、service接口、service方法里都不生效,获取的还是默认的主数据源。猜测是由于spring的aop切面机制导致拦截不到@DS注解,进而不能切换数据源,正确的做法是添加到service实现类或者实现类里具体的方法上。
  2. 在事务方法内调用@DS注解的方法,@DS注解同样不生效,原因是spring只能拦截到最外层方法的@Transactional注解,此时加载该事务的数据源,在事务方法内即使调用了@DS注解的方法,获取的是外层事务的数据源,导致@DS失效。
  3. 在同一个实现类中,一个非DS注解的常规方法里调用@DS注解的方法,同样存在@DS失效的情况,原因同2,是由spring的aop机制导致的,如果确有这种业务需要,可以将该DS注解方法定义在不同的类中,通过bean注入的方式调用,就不会出现这个问题。
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐