专栏首页用户3749098的专栏mysql_ping与mysql长连接

mysql_ping与mysql长连接

首先,如果使用了长连接而长期没有对数据库进行任何操作,那么在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连接。当系统运行一阶段后,有些请求会出现操作“Internalerror”,而操作一次可能又会成功。经过多方调试,发现是mysql连接超时。如果使用了长连接而长期没有对数据库进行任何操作,那么在timeout值后,mysql server就会关闭此连接,而客户端在执行查询的时候就会得到一个类似于“MySQL server hasgone 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 thecorresponding variables.会话变量被重新初始化为相应的变量。 这也影响那些隐式声明的变量,SETNAMES。比如使用This also affects variables that are set implicitly bystatements 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能够自动重连数据库。如果是在mysql5.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。

    个人觉得,如果数据库操作不频繁的话,可以使用短连接,即用时连接,不用时断开。

原文链接:https://blog.csdn.net/liujiayu2/article/details/76512384

相关文章

  • 蛋疼的mysql_ping()以及MYSQL_OPT_RECONNECT

    From: https://www.felix021.com/blog/read.php?2102

    1850810
  • PHP Mysql函数汇总表

    mysql_affected_rows — 取得前一次 MySQL 操作所影响的记录行数mysql_change_user —  改变活动连接中登录的用户mys...

    苦咖啡
  • 如何用C++自己实现mysql数据库的连接池?

    现在几乎所有的后台应用都要用到数据库,什么关系型的、非关系型的;正当关系的,不正当关系的;主流的和非主流的, 大到Oracle,小到sqlite,以及包括现在逐...

    冬夜先生
  • [PHP] time_wait与长连接短连接

    服务端上查看tcp连接的建立情况,直接使用netstat命令来统计,看到了很多的time_wait状态的连接.这些状态是tcp连接中主动关闭的一方会出现的状态....

    陶士涵
  • Mysql占用过高CPU时的优化手段

    Mysql占用CPU过高的时候,该从哪些方面下手进行优化? 占用CPU过高,可以做如下考虑: 1)一般来讲,排除高并发的因素,还是要找到导致你CPU过高的哪几条...

    洗尽了浮华
  • MySQL性能优化必知:长连接、短连接、连接池

    当数据库服务器和客户端位于不同的主机时,就需要建立网络连接来进行通信。客户端必须使用数据库连接来发送命令和接收应答、数据。通过提供给客户端数据库的驱动指定连接字...

    码农架构
  • python 长连接 mysql数据库

    python链接mysql中没有长链接的概念,但我们可以利用mysql的ping机制,来实现长链接功能

    py3study
  • 如何实现CDH元数据库MySQL的高可用

    在前面Fayson讲过《如何实现CDH元数据库MySQL的主主互备》,那如何做到MySQL的高可用呢?本篇文章主要介绍如何使用Keepalived实现MySQL...

    Fayson
  • jmeter与长连接压测

    线程组是是所有测试计划的起点。一切的controller和sampler都必须在线程组下面,其它的元素,比如listener,可能直接放在了测试计划下面,这种情...

    爬蜥
  • MySQL MySql连接数与线程池

    http://dev.mysql.com/doc/refman/5.7/en/set-statement.html

    授客
  • MYSQL子查询与连接

    37:子查询与连接 SET 列名 gbk;//改变客户端数据表的编码类型。 子查询 子查询(Subquery)是指出现在其他SQL语句内的SELECT子句 例...

    别先生
  • php一步一步实现mysql协议(四)——执行命令

    发送完认证请求之后,服务端返回 OK Response ,然后就可以发送执行命令消息了;报文结构为

    码缘
  • HTTP 长连接和短连接

    1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用I...

    joshua317
  • 新浪长连接转为短连接的API与详解

    新浪提供了长链接转为短链接的API,可以把长链接转为 t.cn/xxx 这种格式的短链接。

    码农程序
  • 长连接keepalive

    亲儿子战略,打是亲儿子,骂也是亲儿子,那又怎么样呢?改变不了亲儿子属性。。。

    SRE运维实践
  • dubbo 长连接

    Dubbo 缺省协议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及 服务消费者机器数远大于服务提供者机器数的情况。 反之,Dubb...

    石臻臻的杂货铺[同名公众号]
  • 如何安装与连接MySQL?

    本文用详细的步骤说明,帮助你一步步掌握MySQL的下载、安装和服务启动,客户端的安装、连接和测试。帮你避开初学MySQL使用中的那些坑。

    王树义
  • 长连接和短连接分析

    1. TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接 时...

    猿人谷
  • HttpComponents HttpClient连接池(9)-长连接

    在上一篇文章里我们介绍了 httpclient 连接池对于 SSL 的支持,这里主要介绍连接池中的长连接。

    TA码字

扫码关注云+社区

领取腾讯云代金券