1. 问题背景与现象分析
最近在维护一个基于SpringBoot+MyBatisPlus+Druid连接池的线上系统时,遇到了一个棘手的数据库连接问题。系统使用的是阿里云的PolarDB(基于MySQL 5.7),在执行某些大表查询和更新操作时,频繁出现"Communications link failure"异常。这个问题的特殊之处在于,它不区分业务高峰期,只要SQL执行时间超过10秒左右,就会稳定复现。
典型的错误堆栈如下:
code复制com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
The last packet successfully received from the server was 10,011 milliseconds ago...
从错误信息可以明确看出,这是一个典型的连接超时问题。MySQL服务器和客户端之间的连接在10秒无通信后被主动断开,而此时客户端仍在等待查询结果,导致后续操作失败。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 常规解决方案的尝试与失败
2.1 连接池参数调优
我们首先尝试调整Druid连接池的各种超时参数:
properties复制spring.datasource.druid.max-wait=30000
spring.datasource.druid.connect-timeout=30000
spring.datasource.druid.query-timeout=30000
spring.datasource.druid.transaction-query-timeout=30000
这些配置理论上应该能解决超时问题,但实际测试发现完全无效。即使将超时时间设置为30秒,问题依旧在10秒左右出现。
2.2 MySQL服务器参数调整
接着我们检查了PolarDB/MySQL实例的参数配置:
sql复制SHOW VARIABLES LIKE '%timeout%';
确认connect_timeout参数已经设置为大于10秒的值,但问题依然存在。这说明问题可能不在MySQL服务器端的连接超时设置上。
2.3 业务层优化尝试
我们还尝试了以下业务层优化
