# 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
maxIdle8已经不再使用,配置了也没效果
maxWait获取连接时最大等待时间,单位毫秒
poolPreparedStatementsfalse是否缓存preparedStatement,即PSCache
maxOpenPreparedStatements-1要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。
validationQuery用来检测连接是否有效的sql 例如:select 1
testOnBorrowtrue申请连接时执行validationQuery检测连接是否有效
testOnReturnfalse归还连接时执行validationQuery检测连接是否有效
testWhileIdlefalse建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
minEvictableIdleTimeMillis一个连接在池中最小生存的时间
maxEvictableIdleTimeMillis一个连接在池中最大生存的时间
timeBetweenEvictionRunsMillis1) 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

  • 如果还出现问题,那么就无能为力了。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全栈程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值