在这里插入图片描述


报错信息

项目使用的是 Mysql 作为关系型数据库,数据库连接池使用的是阿里系开源 Druid
今天测试给我发了这么一段报错信息,下意识认为这是由于 Mysql 连接时间配置过短引起的
没有太放在心上(因为没有执行 Mysql 修改的权限😢)在网上一搜发现不是这么回事
粘贴报错信息如下:

Could not open JDBC Connection for transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 
The last packet successfully received from the server was 847,561 milliseconds ago.  
The last packet sent successfully to the server was 847,569 milliseconds ago. 
is longer than the server configured value of 'wait_timeout'. 
You should consider either expiring and/or testing connection validity before use in your application, 
increasing the server configured values for client timeouts, 
or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.

问题思路

在网上看到很多人也遇到了同样的问题,本着先去官网查看的原则(Druid 有中文官方文档😂)
查看官方文档发现设计相关配置有以下三个,为了不影响性能所以将 testOnBorrowtestOnReturn 设置为 false

参数名称参数说明
testOnBorrowfalse申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
testOnReturnfalse归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
testWhileIdletrue建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效

解决方式

根本问题就是数据库已经断开连接了,但是连接池 Druid 并不知道,这个时候就需要将 testWhileIdle 设置为 True,用来检测连接是否有效的 sql,要求是一个查询语句,常用 select 'x'。如果 validationQuery 为 nulltestOnBorrowtestOnReturntestWhileIdle 都不会起作用


微信搜索【源码兴趣圈】,关注龙台,回复【资料】领取涵盖 GO、Netty、SpringCLoud Alibaba、Seata、开发规范、面试宝典、数据结构等电子书 or 视频学习资料!

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐