SpringBoot连接MySQL报错CommunicationsException: Communications link failure

情况说明

一个定时任务查询数据进行汇总,查询时间大约在20-30秒,应用链接报错。

CommunicationsException: Communications link failure

The last packet successfully received from the server was 10,026 milliseconds ago.

环境

MySQL8.0

mysql-connector-java.8.0.29

druid.1.2.15

本文适用于druid.1.2.12及以上并且通过修改配置无效的情况参考。

尝试解决方案

一、修改数据库配置(没重启数据库,测试无效)

show global variables like '%TIMEOUT%'
set global WAIT_TIMEOUT=1814400; -- 28800 
set global connect_timeout=100; -- 10 

二、配置数据源连接信息(测试无效)

 

问题解决

在jdbc的URL增加

&connectTimeout=60000&socketTimeout=60000

jdbc:mysql://127.0.0.1:3306/common?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false&serverTimezone=Asia/Shanghai&connectTimeout=60000&socketTimeout=60000

Releases · alibaba/druid · GitHub阿里云计算平台DataWorks(https://help.aliyun.com/document_detail/137663.html) 团队出品,为监控而生的数据库连接池 - Releases · alibaba/druidhttps://github.com/alibaba/druid/releases

Druid 1.2.12版本发布,连接池默认指定socketTimeout,增强SQL Parserhttps://github.com/alibaba/druid/releases/tag/1.2.12

这个版本连接池默认增加配置connectTimeout和socketTimeout,增强了SQL Parser

  1. 连接池DruidDataSource支持新的配置connectTimeout和socketTimeout,分别都是10秒。这个默认值会减少因为网络丢包时导致的连接池无法创建链接。

### 关于 Java 中 `CommunicationsException: Communications link failure` 的解决方案 当遇到 `com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure` 错误时,通常意味着客户端与 MySQL 数据库之间的通信链路出现问题。此问题可能由多种因素引起,包括但不限于网络不稳定、服务器配置不当以及应用程序设置不合理。 #### 原因分析 该错误的发生可能是由于以下几个方面: - **网络连接中断**:如果网络环境不佳或存在防火墙阻止,则可能导致无法建立到数据库的有效TCP/IP会话[^4]。 - **等待超时过短**:默认情况下,MySQL 服务端对于闲置连接有一个较短的 `wait_timeout` 参数设定;一旦超过这个时限而未收到新的请求指令,就会自动断开现有链接[^3]。 - **SQL语句执行缓慢**:长时间运行的操作可能会超出预设的时间限制(即 socket 超时),从而触发此类异常情况[^5]。 #### 解决方案概述 针对上述提到的各种可能性,可以采取相应措施来解决问题并提高系统的稳定性: ##### 修改 MySQL 配置文件 `/etc/my.cnf` 通过调整全局变量 `wait_timeout` 和其他相关参数值,允许更长周期内的非活动状态而不被强制关闭连接。具体做法是在 `[mysqld]` 段落下增加或更改如下选项: ```ini [mysqld] ... wait_timeout = 28800 # 设置为8小时 interactive_timeout = 28800 max_allowed_packet = 64M ``` 重启 MySQL 服务使新配置生效。 ##### 应用程序层面优化 为了防止因为单次查询耗时太长而导致的整体应用崩溃,在编写 JDBC 连接字符串时加入一些额外属性以增强鲁棒性和兼容性[^1]: ```java String url = "jdbc:mysql://localhost:3306/dbname" + "?useUnicode=true&characterEncoding=UTF-8" + "&connectTimeout=10000" // 初始握手超时时间为10秒 + "&socketTimeout=60000"; // Socket读取数据的最大等待时间为60秒 Connection conn = DriverManager.getConnection(url, user, password); ``` 另外还可以考虑使用连接池技术如 HikariCP 或者 Druid 来管理数据库资源,它们能够有效减少频繁创建销毁物理连接所带来的性能损耗,并提供更好的线程安全特性。 ##### 处理慢 SQL 查询 识别那些消耗大量时间和资源的大规模事务处理逻辑,对其进行重构或者分批加载改造,确保每次交互都能快速完成,不会轻易触碰到任何一方所定义好的时间界限。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

菜鸟叮咚糖

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

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

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

打赏作者

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

抵扣说明:

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

余额充值