功能
Druid是一个数据库连接池,并且提供了一下功能:
使用配置
Druid的配置有不少坑,请注意。
依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.20</version>
</dependency>
这里要注意版本号,选择1.1.20
配置
从网上看,durid配置有2种方式,一种是yml配置,另外一种是配置类方式。
这里直接采用yml配置配置的方式,配置文件如下:
public-key: xxxx你的公钥xxxx
spring:
redis:
host: localhost
port: 6379
password:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
username: root
password: xxxx你的加密后密码xxxx
url: jdbc:mysql://localhost:3306/smart_auth?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true
driver-class-name: com.mysql.cj.jdbc.Driver
initial-size: 5
min-idle: 5
max-active: 20
# 配置获取连接等待超时的时间
max-wait: 60000
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: conn,stat,wall,slf4j,config
connection-properties: config.decrypt=true;config.decrypt.key=${public-key};
test-on-borrow: false
test-on-return: false
test-while-idle: true
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
time-between-eviction-runs-millis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
min-evictable-idle-time-millis: 30000
validation-query: select 'x'
# 打开PSCache,并且指定每个连接上PSCache的大小
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
use-global-data-source-stat: true
stat-view-servlet:
enabled: true
login-username: admin
login-password: admin
reset-enable: false
url-pattern: /druid/*
allow: 127.0.0.1
web-stat-filter:
url-pattern: /*
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
filter:
stat:
log-slow-sql: true
slow-sql-millis: 3000
merge-sql: true
wall:
enabled: true
db-type: mysql
config:
drop-table-allow: false
# delete-allow: false
multi-statement-allow: true
配置上有2点小坑:
要点
SQL监控
-
SQL监控用的是stat,需要在filters中增加stat
-
通过stat-view-servlet配置登录的账号、密码
-
通过filter.stat配置其他参数
-
通过http://127.0.0.1:8080/druid/index.htm
,8080是spring启动的端口
注意:如果启动security,需要在WebSecurityConfigurer
中忽略掉/druid/**
SQL防注入
-
使用wall来进行防注入,filters中增加wall
-
配置wall
druid.filter.wall.enabled=true
druid.filter.wall.config.db-type=mysql
druid.filter.wall.config.drop-table-allow=false //不能执行drop表
druid.filter.wall.config.delete-allow=false //不能执行delete
数据库密码加密
-
使用config来进行数据库账号、密码加密,filters中增加config
-
生成秘钥
cd druid-1.1.20.jar所在目录
,如~/.m2/repository/com/alibaba/druid/1.1.20
java -cp druid-1.1.20.jar com.alibaba.druid.filter.config.ConfigTools 你的密码
生成了privateKey,publicKey,password
-
配置config
filters中增加config
修改password为生成的密码
连接时使用公钥:
connection-properties: config.decrypt=true;config.decrypt.key=${public-key};
public-key: 你的公钥
这里有个小坑,druid还有一个connect-properties
的配置,很有迷惑性,千万不能配置到它下。
参考:参考1、参考2、参考3
自定义扩展
-
继承FilterEventAdapter
@Slf4j
public class ConnectionLogFilter extends FilterEventAdapter {
@Override
public void connection_connectBefore(FilterChain chain, Properties info) {
log.info("BEFORE CONNECTION!");
}
@Override
public void connection_connectAfter(ConnectionProxy connection) {
log.info("AFTER CONNECTION!");
}
}
-
配置ConnectionLogFilter的别名
在resource的META-INF下创建druid-filter.properties
,输入:
druid.filters.conn=com.duobang.auth.interceptor.ConnectionLogFilter
com.duobang.auth.interceptor修改为你的包名
-
配置config
在filters中增加conn
filters: conn,stat,wall,slf4j,config