使用druid数据源发生communication link failer异常

项目使用springBoot作为框架,使用Druid数据源,使用mysql版本为5.6。

线上出现错误  

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

在网上了解到:出现链接中断的原因是:mysql会中断l在一段时间内一直保持的空闲的连接,而连接池并没有抛弃任何的空闲连接。所以当程序在达到请求数据库的代码时,如果连接池将已经中断的连接分配给线程,就会出现link failer错误。

使用mysql4版本的,可以在url中使用autoReconnet设置自动连接:url=jdbc:mysql://localhost:3306/test?autoReconnect=true。

但是到了mysql5,autoReconnect就失效了。

解决办法:

  办法一:修改mysql的内置变量。

      查询timeout变量:使用语句show variables like '%timeout%';   会出现与timeout相关的变量。

这里面,我们仅需要关注两个变量:wait_timeout、interactive_timeout。它们默认都是8小时。最大值是一年。一定要将这两个变量一起改,使用语句set gloal variables wait_timeout = 28800;

改变之后要记得重启mysql才可以。

  办法二:修改代码层面连接池配置。下面贴出可用的springboot配置

复制代码
 1 sharding:
 2   jdbc:
 3     datasource:
 4       names: master
 5       master:
 6         type: com.alibaba.druid.pool.DruidDataSource
 7         driver-class-name: com.mysql.jdbc.Driver
 8         url: jdbc:mysql://localhost:3358/test
 9         username: root
10         password: 123456
11         #自动检测连接开关
12         testWhileIdle: true
13         #检测语句
14         validationQuery: select 1
15         #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
16         #因为我自己配置的是空闲连接1分钟断开,所以此处测试连接间隔为55s
17         timeBetweenEvictionRunsMillis: 55000
springboot 的druid配置
复制代码

 

posted @   翊梦  阅读(5556)  评论(1编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示