SpringBoot多数据源@DS配置以及使用的一些问题总结

本文介绍了在Spring Boot中配置多数据源时遇到的Hikari连接池配置不生效的问题,并提供了正确的配置示例。同时,讨论了@DS注解在不同场景下的生效条件,强调其应在Service实现类或方法上使用以确保数据源切换正常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常规配置(以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注入的方式调用,就不会出现这个问题。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值