MySql连接空闲8小时自动断开引起的问题
2024-08-29 20:00:45
一、问题描述
最近遇到了一个奇怪的MySql数据库问题,好几次前一天晚上历史数据还正常存储,第二天早上来了看实时数据存储还正常,历史数据不存储了。找了好久也没找到问题。后来仔细想了想,历史数据设置了变化才存储,是不是数据一直不变,就一直没有往数据库写数据,导致MySql的连接太久不用自动断开了。然后就百度了一下,Mysql空闲连接有效时长,一看都说是8个小时就自动断开了。嗯,有点感觉了,应该就是这个原因。
二、问题排查
根据查到的资料查看MySql 有两个参数,可以设定空闲连接的有效时长,分别是interactive_timeout
和wait_timeout
,可以在mysql配置文件中设置。根据这一点,可以来进行排查了。
- 使用
show variables like '%timeout%';
命令查询以上两个参数的值,一查都是28800(单位是秒,刚好8小时)。 - 在mysql配置文件中修改
interactive_timeout
和wait_timeout
都为100,这样连接100秒不使用就自动关闭了。 - 重启mysql服务,开始向数据库中插入数据,中间暂停3分钟(确保空闲连接已经断开),可以使用
show status like 'Threads%'
命令来查看当前的连接数,查询结果中Threads_connected
即为当前连接数。 - 继续向mysql插入数据,一看数据果然没有存储上,问题成功复现并找到原因。
三、解决问题
- 查看数据存储部分代码,发现代码中有做断开重连,但是判断连接是否有效的部分写的有问题,也没有校验
mysql_query
的返回值,所以数据存储失败的时候没有产生日志。 - 修改代码,连接断开后自动重连,校验
mysql_query
的返回值并产生日志,使每次数据库操作结果都有记录。注意:mysql c/c++ APImysql_query
返回 0为操作成功,非0为操作失败。
四、一点反思
这个问题完全是由于代码写的不严谨造成的,如果代码写的严谨,该校验的地方都加上校验,就算出现问题也能快速定位。吃一堑,长一智以后需要多注意,养成良好的代码习惯。还有就是需要找时间系统的学习一下数据库方面的内容,项目锻炼是能够快速学习一些内容,但是都是用到哪部分学哪部分,不系统。还是需要自己多花时间系统的学。
最新文章
- 如何得到EF(ADO.NET Entity Framework)查询生成的SQL? ToTraceString Database.Log
- The POM for XXX:jar:${com.ld.base.service.version} is missing, no dependency information available
- Sql Server之旅——第四站 你必须知道的非聚集索引扫描
- JavaScript 的错误(Error)与异常(Exception)处理
- 【转】selenium之 定位以及切换frame
- linux3
- windows service 安装和卸载指令
- RHEL7 -- Linux搭建FTP虚拟用户
- html类,id规范命名
- gridView自己定义做时间排版
- css 居中,中央
- 【iOS】7.4 定位服务->;2.1.3.1 定位 - 官方框架CoreLocation 功能1:地理定位
- CSS媒体查询适配范例
- Windows Server 2012 NIC Teaming 网卡绑定介绍及注意事项
- undefined reference to symbol '_ZNK11GenICam_3_016GenericException17GetSourceFileNameEv'
- Oracle下载 OPatch
- EBS测试环境DataGuard配置
- idea导出war包并在tomcat上部署
- 铁乐学Python_day06-整数和字符串小数据池
- jQuery.merge与concat的区别
热门文章
- BZOJ1024:[SCOI2009]生日快乐(DFS)
- 左侧多级菜单,高亮显示js
- 通过SQL Server 2008 访问Oracle 10g
- nginx反向代理与Real-IP和X-Forwarded-For.txt
- 360极速浏览器极速模式通过hosts文件切换兼容模式bat脚本
- Qt+QGIS二次开发:QGIS中使用QgsRubberBand类创建临时图形
- battery for stm32
- Selenium:浏览器及鼠标、键盘事件
- 使用 WebSocket 客户端连接 MQTT 服务器
- Luogu2045 方格取数加强版(K取方格数) 费用流