zoukankan      html  css  js  c++  java
  • MySql连接空闲8小时自动断开引起的问题

    一、问题描述

    ​ 最近遇到了一个奇怪的MySql数据库问题,好几次前一天晚上历史数据还正常存储,第二天早上来了看实时数据存储还正常,历史数据不存储了。找了好久也没找到问题。后来仔细想了想,历史数据设置了变化才存储,是不是数据一直不变,就一直没有往数据库写数据,导致MySql的连接太久不用自动断开了。然后就百度了一下,Mysql空闲连接有效时长,一看都说是8个小时就自动断开了。嗯,有点感觉了,应该就是这个原因。

    二、问题排查

    根据查到的资料查看MySql 有两个参数,可以设定空闲连接的有效时长,分别是interactive_timeoutwait_timeout ,可以在mysql配置文件中设置。根据这一点,可以来进行排查了。

    1. 使用show variables like '%timeout%';命令查询以上两个参数的值,一查都是28800(单位是秒,刚好8小时)。
    2. 在mysql配置文件中修改interactive_timeoutwait_timeout都为100,这样连接100秒不使用就自动关闭了。
    3. 重启mysql服务,开始向数据库中插入数据,中间暂停3分钟(确保空闲连接已经断开),可以使用show status like 'Threads%'命令来查看当前的连接数,查询结果中Threads_connected即为当前连接数。
    4. 继续向mysql插入数据,一看数据果然没有存储上,问题成功复现并找到原因。

    三、解决问题

    1. 查看数据存储部分代码,发现代码中有做断开重连,但是判断连接是否有效的部分写的有问题,也没有校验mysql_query 的返回值,所以数据存储失败的时候没有产生日志。
    2. 修改代码,连接断开后自动重连,校验mysql_query 的返回值并产生日志,使每次数据库操作结果都有记录。注意:mysql c/c++ API mysql_query返回 0为操作成功,非0为操作失败。

    四、一点反思

    ​ 这个问题完全是由于代码写的不严谨造成的,如果代码写的严谨,该校验的地方都加上校验,就算出现问题也能快速定位。吃一堑,长一智以后需要多注意,养成良好的代码习惯。还有就是需要找时间系统的学习一下数据库方面的内容,项目锻炼是能够快速学习一些内容,但是都是用到哪部分学哪部分,不系统。还是需要自己多花时间系统的学。

  • 相关阅读:
    SpringBoot入门篇--整合mybatis+generator自动生成代码+druid连接池+PageHelper分页插件+SpringBoot整合Mybatis-plus
    认证 (authentication) 和授权 (authorization) 的区别
    新手redis集群搭建
    Nginx是什么?
    分布式和集群的区别
    springBoot 项目 jar/war打包 并运行
    pyV8不支持dom操作,关于PyV8的支持DOM的疑问
    Python爬虫:更加优雅的执行JavaScript(PyV8)
    python中正则表达式 re.findall 用法
    Python爬虫-破解JS加密的Cookie
  • 原文地址:https://www.cnblogs.com/ay-a/p/10520425.html
Copyright © 2011-2022 走看看