当前位置: 首页 > article >正文

【MYSQL数据库异常处理】执行SQL语句报超时异常

MYSQL执行SQL语句异常:The last packet successfully received from the server was 100,107 milliseconds ago. The last packet sent successfully to the server was 100,101 milliseconds ago.

这个错误表明 MySQL 服务器与 JDBC 连接之间的通信超时了。通常由以下几种情况引起:

错误原因

长时间没有交互(MySQL 服务器关闭了空闲连接)

MySQL 服务器的 wait_timeout 或 interactive_timeout 设置较短,导致长时间未使用的连接被关闭。

SQL 查询执行时间过长

如果查询运行时间超过 JDBC 连接的 socketTimeout,MySQL 驱动程序会终止连接。

网络问题

服务器端或客户端的网络连接中断,导致 JDBC 连接失败。

MySQL 服务器崩溃或重启

服务器重启后,原来的连接失效,导致客户端报错。

解决方案

✅ 方法 1:增加 MySQL wait_timeout 和 interactive_timeout

执行以下 SQL 命令,查看 MySQL 服务器的超时时间:

SHOW VARIABLES LIKE 'wait_timeout';
SHOW VARIABLES LIKE 'interactive_timeout';

如果值较小(例如 28800 秒以下),可以尝试增加:

SET GLOBAL wait_timeout = 28800;
SET GLOBAL interactive_timeout = 28800;

⚠️ 注意:此修改对现有连接无效,仅对新连接生效。如果需要持久生效,请修改 my.cnf 或 my.ini 配置:

[mysqld]
wait_timeout=28800
interactive_timeout=28800

然后重启 MySQL 服务器。

✅ 方法 2:在 JDBC 连接 URL 中添加 autoReconnect=true&socketTimeout

修改 JDBC 连接 URL,设置自动重连和超时:

String url = "jdbc:mysql://localhost:3306/testdb?autoReconnect=true&socketTimeout=60000";
Connection conn = DriverManager.getConnection(url, user, password);

autoReconnect=true:当连接丢失时,自动重新连接(⚠️ MySQL 8+ 已不推荐使用)。
socketTimeout=60000:设置 socket 超时时间为 60 秒,防止过早断开。

✅ 方法 3:使用 keep-alive 保持连接

如果 MySQL 连接长时间空闲,MySQL 服务器可能会断开连接。可以使用 HikariCP 或 Druid 连接池,每隔一段时间发送 ping 保持连接。

HikariCP 连接池配置
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/testdb");
config.setUsername("root");
config.setPassword("password");
config.setMaximumPoolSize(10);
config.setMinimumIdle(2);
config.setIdleTimeout(30000);  // 30 秒空闲超时
config.setKeepaliveTime(15000); // 每 15 秒发送 keep-alive
HikariDataSource dataSource = new HikariDataSource(config);

keepaliveTime=15000:每 15 秒发送一个 ping,防止连接超时。

Druid 连接池配置
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl("jdbc:mysql://localhost:3306/testdb");
dataSource.setUsername("root");
dataSource.setPassword("password");
dataSource.setMinIdle(5);
dataSource.setMaxActive(10);
dataSource.setValidationQuery("SELECT 1");
dataSource.setTestWhileIdle(true);
dataSource.setTimeBetweenEvictionRunsMillis(30000); // 30 秒检测一次

validationQuery=“SELECT 1”:连接池在连接空闲时,发送 SELECT 1 测试连接是否可用。

✅ 方法 4:检查 MySQL 服务器状态

如果服务器已经重启或崩溃,尝试重启 MySQL:

sudo systemctl restart mysql  # Linux
net stop mysql && net start mysql  # Windows

总结

在这里插入图片描述
还可以结合 连接池 + socketTimeout + keepalive 方式,来确保 JDBC 连接的稳定性。


http://www.kler.cn/a/574108.html

相关文章:

  • 【RK3588嵌入式图形编程】-SDL2-裁剪和定位图像
  • windows下安装pipx
  • 【CF】C. Tokitsukaze and Two Colorful Tapes+C. Where is the Pizza?
  • 深度学习笔记16-运动鞋品牌识别(Pytorch)
  • 第九篇《行军篇》
  • 如何避免忽略安全、性能等非功能性需求
  • TDengine SQL查询语法
  • 网络安全规划分层安全域
  • ADB 和 Monkey 进行 Android 应用的测试和调试
  • 大模型最新面试题系列:训练篇之训练稳定性
  • 深入探索 Django 内置的 User 模型及其自定义扩展
  • WordPress使用(3)
  • 宜宾数字产业园区因树莓集团布局迎来新发展契机
  • 美国国家航空航天局(NASA)的PUNCH任务
  • AcWing 蓝桥杯集训·每日一题2025·5526. 平衡细菌
  • Redis 中 string 和 list 的原理说明
  • MCU-缓存Cache与CPU中的主存SRAM
  • 9.RabbitMQ消息的可靠性
  • SAP环保-装备制造领域创新解决方案
  • 深度学习在SSVEP信号分类中的应用分析