最近项目需要配置2个数据库连接,一个负责门户图片查询连接,一个对接后台接口,初次配置没生效,于是查找了下原因,特此记录共勉。
初次配置没生效原因是我把POM中 druid 给屏掉了。 当时因为baomidou的dynamic 里也有druid,简单的认为不需要druid了,直接屏掉才导致配置未生效。
正确配置如下,很简单。
一、配置依赖
<!-- druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.17</version> </dependency> <!-- 动态数据源 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>2.5.4</version> </dependency>
二、修改配置application_dev.yml
spring:
autoconfigure:
exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
datasource:
druid:
stat-view-servlet:
enabled: true
loginUsername: admin
loginPassword: 123456
allow:
web-stat-filter:
enabled: true
dynamic:
druid: # 全局druid参数,单独数据源配置为空时取全局配置
# 连接池的配置信息
# 初始化大小,最小,最大
initial-size: 1
min-idle: 2
maxActive: 8
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
# 打开PSCache,并且指定每个连接上PSCache的大小
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,slf4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
datasource:
master:
url: jdbc:mysql://192.168.65.101:3306/test?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&zeroDateTimeBehavior=convertToNull
username: test
password: 'test'
driver-class-name: com.mysql.jdbc.Driver
druid: #配置master 默认连接池参数
# 连接池的配置信息
# 初始化大小,最小,最大
initial-size: 3
min-idle: 3
maxActive: 8
# 配置获取连接等待超时的时间
maxWait: 600000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
# 打开PSCache,并且指定每个连接上PSCache的大小
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,slf4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
multi-datasource1:
url: jdbc:mysql://192.168.65.101:3306/test?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&useSSL=false
username: test
password: 'test'
driver-class-name: com.mysql.jdbc.Driver
druid: # 配置multi-datasource1 数据源连接池参数
# 连接池的配置信息
# 初始化大小,最小,最大
initial-size: 2
min-idle: 2
maxActive: 2
# 配置获取连接等待超时的时间
maxWait: 600000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
# 打开PSCache,并且指定每个连接上PSCache的大小
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,slf4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
重启后,通过netstat -ant|grep -v grep|grep 3306|wc -l 查看本机连接数据库个数(注意本机其它连接数据库的软件)。
到此配置完成, 之后就可以使用@DS 注解放在方法上指定数据源了(默认数据源不需要加注解)。
三、说明
1. druid是alibaba出品的连接池,也支持多数据源,但是要写配置类。
2. dynamic是baomidou 出的一个动态连接池包,默认使用druid连接池,也可配置使用其它如Hikari。
四、源码跟踪
1. 基于springboot入口:自动配置类,创建动态数据源
DynamicDataSourceAutoConfiguration
2. 加载参数配置
3. 创建druid数据源
这里会进行替换,当独立数据源没有配置电接池参数时,会对null参数取全局配置进行替换。
如果大家在配置参数过程不生效或其它问题,可以打开DEBUG跟踪一下,以上祝顺利。