Druid 配置参数及常见报错
- Druid是Java语言中最好的数据库连接池。Druid能够提供强大的监控和扩展功能。
依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid-version}</version>
</dependency>
注解方式配置数据源
参数 | 默认值 | 参数作用 |
---|---|---|
name | 标识数据源名称 | |
url | 数据库链接 url | |
username | 数据库用户名 | |
password | 数据库密码 | |
driverClassName | 根据url自动识别 | 这一项可配可不配,如果不配置druid会根据url自动识别dbType |
initialSize | ||
maxActive | ||
maxIdle | 8 | 已经不再使用,配置了也没效果 |
maxWait | 获取连接时最大等待时间,单位毫秒 | |
poolPreparedStatements | false | 是否缓存preparedStatement,即PSCache |
maxOpenPreparedStatements | -1 | 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。 |
validationQuery | 用来检测连接是否有效的sql 例如:select 1 | |
testOnBorrow | true | 申请连接时执行validationQuery检测连接是否有效 |
testOnReturn | false | 归还连接时执行validationQuery检测连接是否有效 |
testWhileIdle | false | 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 |
minEvictableIdleTimeMillis | 一个连接在池中最小生存的时间 | |
maxEvictableIdleTimeMillis | 一个连接在池中最大生存的时间 | |
timeBetweenEvictionRunsMillis | 1) Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接。2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明 | |
数据库 wait_timeout 较短导致出错
- 程序报错描述如下:模拟
wait_timeout
设置为2分钟。
java.sql.SQLException: Could not retrieve transation read-only status server
The last packet successfully received from the server was 3,004 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago.
### Error updating database. Cause: java.sql.SQLException: Could not retrieve transation read-only status server
mysql设置的一个connection的空闲时间,超过这个时间,mysql就会主动断了这个connection,而连接池并不知道该connection已经失效,如果这时有Client请求connection,那么会报错。
- 查看数据库的
wait_timeout
时间:SHOW GLOBAL VARIABLES LIKE '%timeout%';
数据库默认的这个时间是28800分钟。
配置信息
spring:
datasource:
# 数据源基本配置
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/duid
type: com.alibaba.druid.pool.DruidDataSource
# 数据源其他配置
initialSize: 5
minIdle: 5
maxActive: 20
# 超时等待连接时间
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
# 最小可空闲时间
minEvictableIdleTimeMillis: 300000
# 检测连接是否存活
validationQuery: SELECT 1 FROM DUAL
# 当true 时候 执行 上面的 select 1,开启保活检测
testWhileIdle: true
# 申请连接的时候检测
testOnBorrow: false
# 归还连接时候检测
testOnReturn: false
poolPreparedStatements: true
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
常见错误
- 上面的数据库
wait_timeout
错误问题。 - 连接失效问题,可以配置数据库连接池检测、回收时间等看上面的配置信息。连接失效后,例如使用Mybatis框架的时候,会报参数为空,空指针问题,还有ConnectionClosed 问题,其实就是因为连接已经失效的问题。
- 排查完上面的可能问题之后,出现下面的问题:空闲连接,被Mysql服务端拒绝连接。可以尝试修改
connect_timeout
时长。
### ERROR c.a.druid.pool.DruidPooledStatement - CommunicationsException, druid version 1.2.5,
jdbcUrl : jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai,
testWhileIdle true,
idle millis 1699995,
minIdle 1, poolingCount 1,
timeBetweenEvictionRunsMillis 600000,
lastValidIdleMillis 1699995, driver com.mysql.cj.jdbc.Driver,
exceptionSorter com.alibaba.druid.pool.vendor.MySqlExceptionSorter
### ERROR com.alibaba.druid.pool.DruidDataSource - discard connection
com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
- 如果还出现问题,那么就无能为力了。