欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 艺术 > 【MYSQL数据库异常处理】执行SQL语句报超时异常

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

2025/3/18 20:25:35 来源:https://blog.csdn.net/weixin_44259212/article/details/146045979  浏览:    关键词:【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 连接的稳定性。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词