最近部署一个系统,后台用线程池来处理请求,而每个线程有一个mysql连接。当系统运行一阶段后,有些请求会出现操作“Internal error”,而操作一次可能又会成功。经过多方调试,发现是MySQL连接超时。如果使用了长连接而长期没有对数据库进行任何操作,那么在 timeout值后,mysql server就会关闭此连接,而客户端在执行查询的时候就会得到一个类似于“MySQL server has gone away“这样的错误。解决方法有两个:

1) 增大/etc/my.cnf中wait_timeout的值,比如设置wait_timeout=8640000,即100天。这个值缺省是8小时。这个方法简单,但是不能彻底解决问题。推荐第二种解决方法。

2)使用mysql_ping来自动检查重连。用到两个函数,一个是mysql_ping,另外一个是mysql_options。具体使用方法是在mysql_real_connect之前,mysql_init之后,使用mysql_options。用法如下:

char value = 1;

(void) mysql_init (&mysql);

mysql_options(&mysql, MYSQL_OPT_RECONNECT, (char *)&value);

然后在以后mysql_query之前首先使用mysql_ping进行判断,如果连接已经断开,会自动重连。

不过,请注意,自动重新连接也会导致一些副作用,如下:

* 任何活动的交易都被回滚,autocommit模式被置为reset。

* 所有表锁都释放

* 所有临时表是关闭(撤消)

* Session variables are reinitialized to the values of the corresponding variables.会话变量被重新初始化为相应的变量。 这也影响那些隐式声明的变量,SET NAMES。比如使用This also affects variables that are set implicitly by statements such as SET NAMES.这也影响了变量,是一套由含蓄的声明,例如订定的名称。

* 用户变量设置都将丢失。

* 编制报表释放。

* 句柄变量被关闭。

* LAST_INSERT_ID()被重置为0 。

* 使用GET_LOCK()获得的锁被释放  首先,如果使用了长连接而长期没有对数据库进行任何操作,那么在timeout值后,mysql server就会关闭此连接,而客户端在执行查询的时候就会得到一个类似于“MySQL server has gone away“这样的错误。一个好的解决方法是使用mysql_ping。在使用mysql_real_connect连接数据库之后,再使用mysql_options( &mysql, MYSQL_OPT_RECONNECT, … ) 来设置为自动重连。这样当mysql连接丢失的时候,使用mysql_ping能够自动重连数据库。如果是在mysql 5.1.6之前,那么则应在每次执行完real_connect 之后执行mysql_options( &mysql, MYSQL_OPT_RECONNECT, … ) ,如果是mysql 5.1.6+,则在connect之前执行一次就够了。

有一种很自然的想法就是,新开一个线程,让它隔一定时间(如20秒)就执行一次mysql_ping.除此而外它什么都不用做。但是显然,这个线程必须与其它线程共享一个mysql连接,共享该mysql句柄。否则这样做一点意义都没有。

但是,mysql_ping会改变mysql_affected_rows的返回值。所以最好是给该MYSQL句柄再加一个mutex(最好是读写 锁)。当其它线程准备执行query的时候,就获取锁,执行完就释放。而这个执行mysql_ping的线程在执行ping之间先尝试获取锁,如果获取失 败,则继续sleep,放弃这一轮的ping。

mysql重连_mysql自动重连相关推荐

  1. php文件夹重命名,PHP自动重命名文件实现方法

    本文实例讲述了PHP自动重命名文件实现方法.分享给大家供大家参考.具体方法分析如下: PHP重命名文件名我们在实际开发过程中经常会使用到,比如用户上传文件或是一些缓存文件自动生成的功能我们都需要使用到 ...

  2. mysql保存测试数据_Mysql自动填充测试数据

    前言 最近写了两个小脚本,一个应用于Mysql的自动填充测试数据,另外一个是bash写的定期删除日志文件,两个脚本如何使用,在GitHub上面都有所说明,这里不再赘述,这里主要是想聊一下Mysql的存 ...

  3. mysql存储过程重命名_MySQL数据库重命名存储过程

    MySQL不支持将整个数据库(db schema)重命名,我们可以通过自己写一个存储过程来实现. 实现思路: 1)创建目标数据库. 2)执行命令:rename table 原库.表 to 目标库.表, ...

  4. mysql 可重复读_mysql 可重复读

    概念 Repeatable Read(可重复读):即:事务A在读到一条数据之后,此时事务B对该数据进行了修改并提交,那么事务A再读该数据,读到的还是原来的内容. 实现原理(MVCC [ 多版本并发控制 ...

  5. mysql 连接闪断自动重连的方法

    使用php作为后台运行程序(例如短信群发),在cli模式下执行php,php需要连接mysql循环执行数据库处理. 当mysql连接闪断时,之后循环的执行将会失败. 我们需要设计一个方法,当mysql ...

  6. mysql 手工修复_MySQL自动备份和手工恢复

    欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入 以下是windows下的批处理: 1set hour_str=%time:~0,2% 2if "%hour_st ...

  7. mysql生成序列_mysql 自动生成编号函数

    根据需求,保存表数据时需要自动生成一个编号,格式如:AA-2020-03-31-0001  (AA-yyyy-MM-dd-序号).数据库用的mysql,所以创建一个mysql函数. 1.建表: cre ...

  8. mysql的自动编码_mysql 自动生成编号函数

    根据需求,保存表数据时需要自动生成一个编号,格式如:AA-2020-03-31-0001  (AA-yyyy-MM-dd-序号).数据库用的mysql,所以创建一个mysql函数. 1.建表: cre ...

  9. mysql 备份 发送邮件_mysql 自动备份发邮件 到指定邮箱

    首先 编写 导出的 命令 使用了 mysqladmin ping mysqldump 然后是 添加附件到邮件中发送 使用了对应的com 最后 暂停 看情况 参考: 见程序: @echo on :: m ...

最新文章

  1. jpgraph中文使用手册之文本和字体控制教程
  2. 汇编语言 把最大值放入max 把最小值放入min_Excel的MAX和MIN,如何用白话弄懂?...
  3. CF401D Roman and Numbers
  4. LoRaWAN与LoRa的区别!
  5. 直播安装vnc连接树莓
  6. 为安装好的SSAS实例重命名
  7. Web程序员的Mysql进阶序一之sql使用分类及基础
  8. 隐马尔科夫模型原理解析
  9. Python中的xxx+=xxx和xxx=xxx+xxx一些区别及执行过程
  10. Fluent Ribbon项目出现“命名空间“clr-namespace:Fluent;assembly=Fluent”中不存在“RibbonWindow”名称”的解决方法...
  11. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_09 序列化流_1_序列化和反序列化的概述...
  12. 蒙特卡洛模拟分析市场风险
  13. docker加了--insecure-registry后docker启动报错Failed to start Docker Application Container Engine.
  14. 金洪林:红邦创衣止于至善_品牌-生活时尚_品牌_YOKA时尚网
  15. c语言阿基米德螺旋线编程,阿基米德螺旋线进刀凸轮外轮廓铣削的编程技巧
  16. ssrs报表服务器数据库配置文件,ReportingServicesService 配置文件
  17. kubevirt 存储 网络 监控
  18. 解决IIS存储空间不足的问题
  19. IOS APP程序发布IPA以及发布上传到AppStore
  20. 软件测试面试题:常见的性能测试方法有哪些?以及每类测试方法的目的是什么?

热门文章

  1. 「开眼」,让你非常开眼的一个开源项目
  2. LTO(Link Time Optimization)优化
  3. ANSA二次开发 - Apps和ANSA插件管理
  4. 解读完这32个观点,我终于发现周鸿祎凭啥这么牛了
  5. 一图看懂yolov3网络
  6. 北极熊优化算法PBO的理论知识以及python代码实现
  7. 无功补偿装置三种投切方式(转载)
  8. 其实今天过节的兄弟们还有多重身份
  9. 一级分类和二级分类的要点
  10. 数据结构学习笔记——链式存储结构实现栈(链栈)