Communications link failure异常分析解决
Communications link failure异常分析解决
- 异常日志
- 分析与解决
- 常见原因
- 解决方法
异常日志
2025-02-05 14:26:58.750 ERROR [aaeae2435a2749ac0c4af65b6e4db68c] [http-nio-9528-exec-6] o.s.t.i.TransactionAspectSupport.completeTransactionAfterThrowing:680 - Application exception overridden by rollback exception
org.springframework.dao.RecoverableDataAccessException:
### Error querying database. Cause: com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
The last packet successfully received from the server was 60,120 milliseconds ago. The last packet sent successfully to the server was 60,120 milliseconds ago.
### The error may exist in class path resource [mybatis/mapper/AppOpenUserMapper.xml]
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: WITH t AS (SELECT user_id FROM basp_user_department WHERE department_id LIKE concat(?, '%') AND main_department = 1) SELECT count(0) FROM basp_app a LEFT JOIN (SELECT app_id, sum(user_status = 1) AS openNum, sum(user_status = 1 AND active_status = 1) AS activeNum FROM basp_app_open_user bao WHERE bao.user_id IN (SELECT user_id FROM t) GROUP BY app_id) t1 ON t1.app_id = a.id LEFT JOIN (SELECT app_id, COUNT(aau.user_id) AS authNum FROM basp_app_auth_user aau WHERE aau.user_id IN (SELECT user_id FROM t) AND aau.org_id = ? GROUP BY app_id) t2 ON t2.app_id = a.id LEFT JOIN (SELECT count(*) AS allNum FROM t) t3 ON 1 = 1 WHERE a.category = 'crm'
### Cause: com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
The last packet successfully received from the server was 60,120 milliseconds ago. The last packet sent successfully to the server was 60,120 milliseconds ago.
; Communications link failure
分析与解决
connectTimeout=30000
socketTimeout=30000
com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
是一个常见的 MySQL 数据库连接异常,表示 JDBC 客户端与 MySQL 服务器之间的通信链路失败。以下是可能的原因及解决方法:
常见原因
- MySQL 服务器未启动或不可访问:
- 确认 MySQL 服务是否正在运行,可以通过命令行使用
mysqladmin -u root -p status
检查。 - 检查连接字符串中的 URL 是否正确,例如
jdbc:mysql://localhost:3306/mydatabase
。
- 确认 MySQL 服务是否正在运行,可以通过命令行使用
- 网络问题:
- 防火墙可能阻止了应用程序与 MySQL 服务器之间的通信。确保防火墙没有阻止 JDBC 连接所使用的端口(默认是 3306)。
- 检查网络配置,确保应用程序可以访问 MySQL 服务器所在的 IP 地址和端口。
- 如果 MySQL 服务器托管在云平台上,还需要检查安全组设置,确保允许从客户端到 MySQL 服务器的 3306 端口的连接。
- 连接超时:
- MySQL 服务器默认的
wait_timeout
是 28800 秒(8 小时),如果连接空闲时间超过此值,MySQL 会自动断开连接。 - 可以通过在 MySQL 配置文件中增加
wait_timeout
的值,或者在 JDBC 连接字符串中添加autoReconnect=true
来避免此问题。
- MySQL 服务器默认的
- JDBC 驱动版本不兼容:
- 确保使用的 JDBC 驱动版本与 MySQL 服务器版本兼容。可以查看 MySQL 官方文档或尝试使用最新版本的驱动。
- 连接池配置问题:
- 如果使用连接池(如 HikariCP 或 Druid),需要配置连接有效性检测,例如设置心跳检测或连接测试语句。
解决方法
- 重启应用服务器:
- 重启应用服务器可以重新初始化数据库连接池,获取有效的数据库连接。
- 调整连接超时设置:
- 在 JDBC 连接字符串中添加或调整
connectTimeout
和socketTimeout
参数,例如:
- 在 JDBC 连接字符串中添加或调整
String url = "jdbc:mysql://localhost:3306/mydb?connectTimeout=10000&socketTimeout=10000";
- 优化网络配置:
- 使用
ping
和traceroute
命令测试网络延迟和路径,确保网络环境稳定。
- 使用
- 更新 JDBC 驱动:
- 下载最新版本的 MySQL Connector/J JAR 文件,并将其添加到项目的类路径中。
- 配置连接池:
- 如果使用连接池,配置连接有效性检测,例如:
druid.connectionErrorRetryAttempts=3
druid.testWhileIdle=true
druid.validationQuery=SELECT 1
通过以上方法,可以有效解决 Communications link failure
异常,确保应用程序与 MySQL 数据库的稳定通信。