【MYSQL数据库异常处理】执行SQL语句报超时异常
创作时间:
作者:
@小白创作中心
【MYSQL数据库异常处理】执行SQL语句报超时异常
引用
CSDN
1.
https://m.blog.csdn.net/weixin_44259212/article/details/146045979
在使用MySQL数据库时,经常会遇到执行SQL语句报超时异常的问题。本文将详细分析这种异常的原因,并提供多种解决方案,帮助开发者和运维人员快速定位和解决问题。
错误描述
这个错误表明 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 连接的稳定性。
热门推荐
练肩很“猛”的杠铃提拉,忽略这5点,你不是在练肩是在毁肩
再忙也要按时吃饭 | 一日三餐有时间 这样吃身体受益
养兔子的方法和技巧
揭秘中国传统吉利数字:从6和8到3、5和9的文化演变
华为打印机硬件故障及解决方法(华为打印机常见故障解析与维修指南)
注重家庭、家教、家风:点亮家族精神的永远灯塔
中国警校:探索守护之路,培养未来之盾
性价比最高的“长寿运动”居然是…
加速心肺升级:5个不可错过的“提速”技巧
校园心理剧,表达自我最动人
探秘古文之谜:解读那些年我们一起追过的文言文
恐怖奶奶2联机版2025最新版:多人联机恐怖逃脱游戏攻略
从牛顿到爱因斯坦:引力理论的革命性演变
使用口罩时,请注意保质期!
饮用水大揭秘:自来水、纯净水、矿泉水,哪种更健康?
当滴滴流水为 500,实际到手是多少?滴滴流水账属于纯收入吗?
三角形面积计算方法详解与实际应用解析
项目年度计划如何做好管理
学习困难莫担忧,中西医结合来帮忙!
山东东营:现代石油城市迎来世界自然遗产新名片
D4是什么
Word参考文献插入与格式化指南:APA、MLA、Chicago格式详解
3月去大理旅游攻略2024 看看这份保姆级出游攻略
3个方法降低体脂率,提升肌肉含量,塑造好看的身材比例
内向性格的挑战:如何有效管理害羞情绪
唯物辩证法是什么?揭开马克思主义哲学的核心原理!
DHA真的这么神奇吗?一篇速答,以后不再迷茫!
9-11月,重磅秋景大盘点,国内21个赏秋胜地,迎来一年中最美时刻
“大一统”理念的历史实践——从宇文泰改革说起
分级基金深度解析:特点、投资策略与风险全攻略