swoole项目思维转换 -- mysql server gone away

mysql做为php的黄金搭档和互联网上应用最广泛的数据库,免不了天天与之打交道,不少朋友在熟悉swoole的使用之后,也趟平了不少坑,准备实战了,终于上线了,正愉快的体验swoole带来的巨大改进,突然数据库操作bug了,大量报mysql server gone away, 于是swooler心里千万之草尼马奔腾而过,大骂,swoole误我~~~

且慢!!!这真不是swoole的问题!!!!不是swoole的问题!!!!不是swoole的问题!!!!(重要的事情说三遍)

原因

    不是swoole的问题,那他的原因是什么呢?

这要从mysql的机制说起,mysql本身是一个多线程的程序,每个连接过来,会开一个线程去处理相关的query, 所以mysql为了避免占着毛坑不拉屎,会定期回收长时间没有任何query的连接(时间周期受wait_timeout配置影响),所以在swoole中,由于是一个长驻内存的服务,我们建立了一个mysql的连接,不主动关闭 或者是用pconnect的方式,那么这个mysql连接会一直保存着,然后长时间没有和数据库有交互,就主动被mysql server关闭了,之后继续用这个连接,就报mysql server gone away了。

解决方案

    知道问题产生的原因,就可以对症下药了。

方案1:  修改mysql的wait_timeout值为一个非常大的值。

此方法不太可取,可能会产生大量的sleep连接,导致mysql连接上限了, 建议不使用。

方案2:每次query之前主动进行连接检测

如果是用mysqli,可用内置的mysqli_ping

示例:

if (!$mysqli->ping()) {

mysqli->connect(); //重连

}

如果是pdo,可以检测mysql server的服务器信息来判断:

try {

$pdo->getAttribute(\PDO::ATTR_SERVER_INFO);

} catch (\Exception $e) {

if ($e->getCode() == ‘HY000‘) {

$pdo = new PDO(xxx);  //重连

} else {

throw $e;

}

}

但这个方案有个缺点:额外多一次请求,所以改进方法:  用一个全局变量存放最后一次query的时间,下一次query的时候先和现在时间对比一下,超过waite_timeout再重连. 或者也可以用swoole_tick定时检测。

方案3:被动检测, 每次query用try catch包起来,如有mysql gone away异常,则重新连接,再执行一次当前sql.
                    示例:

try {

query($sql);

} catch (\Exception $e) {

if ($e->getCode() == ‘HY000‘) {

reconnect(); //重连

query($sql)

} else {

throw $e;

}

}

方案4: 用短连接,务必每次操作完之后,手动close

额外问题:mysql为什么需要连接池?

时间: 2024-10-27 10:51:23

swoole项目思维转换 -- mysql server gone away的相关文章

atitit。mssql sql server 转换mysql 及 分页sql ast的搭建

atitit.mssql sql server 转换mysql  及 分页sql ast的搭建 1. 主要的的转换::函数的转换,分页的转换 1 2. 思路::mssql sql >>ast>>mysql 1 3. sql主要的如下::: 1 4. Mssql2MysqlConvertor (proj:wechatAdm4propt 2 1. 主要的的转换::函数的转换,分页的转换 2. 思路::mssql sql >>ast>>mysql 3. sql主要

swoole结合php的pdo mysql模式出现MySQL server has gone away

mysql做为php的黄金搭档和互联网上应用最广泛的数据库,免不了天天与之打交道,不少朋友在熟悉swoole的使用之后,也趟平了不少坑,准备实战了,终于上线了,正愉快的体验swoole带来的巨大改进,突然数据库操作bug了,大量报mysql server gone away, 于是swooler心里千万之草尼马奔腾而过,大骂,swoole误我--- 且慢!!!这真不是swoole的问题!!!!不是swoole的问题!!!!不是swoole的问题!!!!(重要的事情说三遍) 原因     不是sw

mysql server 配置 转

MySQL Server 5.0 – 安装及配置 Author : Jeff   2006-2-20 关键字: MySQL 配置 环境:Window XP Professional + SP2, MySQL Server 5.0 下载软件: MySQL Server 5.0.18 http://dev.mysql.com/downloads/mysql/5.0.html 下载MySQL Server,并安装在本地机器上. 下面两个为Windows图形界面工具. MySQL Query Brows

MySQL Server 5.5.44免安装版配置详解

转载地址:http://wenku.baidu.com/view/2a8bfe6a25c52cc58bd6beff.html### 一 下载MySQL http://dev.mysql.com/downloads/mysql/5.0.html 解压MySQL(F:\Program Files\MySQL\)MySQL安装目录 二 新建my.ini 在F:\Program Files\MySQL\下建立my.ini文件,内容为 [mysqld] # 设置mysql的安装目录 basedir=D:\

ubuntu 14.04 安装mysql server初级教程

序,mysql数据库是开源的,被大多数企业所使用 目录 一.apt-get install 软件安装原理剖析二.安装mysql server三.配置和管理msyql 一.apt-get install 软件安装原理剖析 /etc/apt/sources.list 这个文件很重要,里面放了一些软件资源的库地址,我们每次利用apt-get install命令安装软件时,都是在读取这个文件. Ubuntu 软件仓库被分为四个部分:main(主要的), restricted(受限的), universe

MySQL Server 5.0–安装及配置/MySQLInstanceConfig.exe用法详解

MySQL Server 5.0–安装及配置/MySQLInstanceConfig.exe用法详解 http://blog.csdn.net/feihong247/article/details/7791105 配置MySQL步骤: 1.       运行MySQL Server安装目录下bin/MySQLInstanceConfig.exe.出现如下所示的向导界面 . 点击"Next"进入下一步. 2.       如果MySQLInstanceConfig在MySQL Serve

解决Can't connect to MySQL server on 'localhost' (10048)

解决Can't connect to MySQL server on 'localhost' (10048) 您使用的是Windows操作系统,此错误与一个注册表键值TcpTimedWaitDelay有关.减小Windows中TcpTimedWaitDelay时间可解决此类问题,默认情况下为240(未设置的情况下也是这个数值) 此项设置需要到注册表如下位置进行设置HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Paramete

解决 2003 Can’t connect to MySQL server on ‘localhost’ (10048)

2003 Can’t connect to MySQL server on ‘localhost’ (10048)一般见于使用mysql的windows 2003服务器.错误的出现的原因: 第一种原因:应用程序需要快速释放和创建新连接, 但是由于 TIME_WAIT 中存在的连接超过默认值,导致较低吞吐量.解决方案:和本错误密切相关的两个windows的注册表项:TcpTimedWaitDelay和MaxUserPort的值.TcpTimedWaitDelay 确 定 TCP/IP 可释放已关闭

MYSQL服务 ERROR 2003 (HY000): Can't connect to MySQL server on "********" 的问题解决

今早来到公司发现昨晚还好好的数据库跑不起来了,这对于本是C语言主编的本人刚刚操作后台来说未免一头雾水. 而且该问题的出现大多是因为一夜突发毫无征兆,或者因为mysql重装.而且网上的题解也有好多答复重装,真是... 具体问题如下: 想必看到这个对于刚刚上手操作mysql的朋友来说都回去查看一下10061这是个什么错误吧. 可恰巧,本人用的是windows系统,网上大多题解都是linux操作环境下的(说到这里,作为程序猿真应该研究一下linux,那也得等现在的项目完毕啊). 像my.cnf配置文件