SpringBoot多数据源@DS配置以及使用的一些问题总结
SpringBoot多数据源@DS配置以及使用的一些问题总结(多数据源配置不生效,DS注解使用不生效)
·
常规配置(以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注解不生效的几种情况
- 进过验证,@DS注解加到mapper接口、service接口、service方法里都不生效,获取的还是默认的主数据源。猜测是由于spring的aop切面机制导致拦截不到@DS注解,进而不能切换数据源,正确的做法是添加到service实现类或者实现类里具体的方法上。
- 在事务方法内调用@DS注解的方法,@DS注解同样不生效,原因是spring只能拦截到最外层方法的@Transactional注解,此时加载该事务的数据源,在事务方法内即使调用了@DS注解的方法,获取的是外层事务的数据源,导致@DS失效。
- 在同一个实现类中,一个非DS注解的常规方法里调用@DS注解的方法,同样存在@DS失效的情况,原因同2,是由spring的aop机制导致的,如果确有这种业务需要,可以将该DS注解方法定义在不同的类中,通过bean注入的方式调用,就不会出现这个问题。
更多推荐
已为社区贡献1条内容
所有评论(0)