# Druid 配置参数及常见报错

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分钟。
    # Druid 配置参数及常见报错
配置信息
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

  • 如果还出现问题,那么就无能为力了。
上一篇:Apache Druid 命令执行漏洞(CVE-2021-25646) 复现


下一篇:SpringBoot2学习笔记——数据访问