使用mysql的长连接

 

 

有个资料看得我云里雾里的。现在用自己的言语来总结一下,写文字,能够加深自己的理解。也会在写的过程中帮助自己发现理解方面瑕疵,继续查资料求证。

 

 

短链接的缺点:创建一个连接,程序执行完毕后,就会自动断掉与mysqlserver的链接。于是多少次php执行,就会多少次这样的创建和释放过程。频繁地创建和释放连接,比较耗费cpu资源。

 

长连接就可以避免每次请求都创建连接的开销,节省了时间和IO消耗。

 

长连接是提高了性能。不过还有一些细节的问题需要解决,即mysql发现一个链接长时间没有执行查询请求,就会自动断掉这个连接。

 

具体多长时间后断掉,有个timeout设置时间。通过sql:"show global variables like '%timeout';" 查看。

 

my.conf中的

wait_timeout=2880000
interactive_timeout = 2880000

 

当链接已经失效了,仍然去执行查询操作,一个明显的表现形式就是提示:MySQL server has gone away

 

启发:MySQL server has gone away这个信息是mysql服务器提示出来的呢?还是php的mysql扩展提示出来的呢?

 

据判断,肯定是应用程序服务器报出来的(php)。想一想,如果mysql都已经接到请求了,那么还出现什么链接不上。明明都已经链接上了。

 

既然mysql服务器都能够接受请求,那么还怎么处理不过来呢。

 

我们去百度搜索:MySQL server has gone away。从来没有看到java链接mysql出现这样的情况。如果是mysql 服务器报出来的。那么应该与应用程序无关。所以应该也会搜索到相关信息的。

据此判断,这是php抛出来的信息。php链接不上mysql了。

 

 

 

 

 

http://ronaldbradford.com/blog/sqlstatehy000-general-error-2006-mysql-server-has-gone-away-2013-01-02/

 

使用mysql_ping()函数能够检测与mysql服务器是不是链接状态。避免出现MySQL server has gone away。

 

每次执行查询前,先使用mysql_ping()去检测一下连接有没有断掉。如果断掉了。重新建立一次链接。

具体代码为:

 

if(mysql_ping()!=0){

 //链接已经断开,需要重新建立链接

    $this->conn = mysql_connect($ip,$user_name,$password);

}

 

小缺点是:每次都要去检测执行mysql_ping(),耗费资源。

 

一种改进办法是:根据mysql_query()的返回错误码来决定是不是要重新链接

 

$res = mysql_query($sql, $this->conn);

       

if($res===false){

 if(mysql_errno($this->conn)==2006 || mysql_errno($this->conn)==2003){

    //去检测一下与mysql服务器的链接是不是有效

    if(mysql_ping()!=0){

       //重新建立链接

 

   }

}

}

 

备注:

  2003对应的错误信息是,Can't connect to MySQL

 

2006 对应的错误信息是 MySQL server has gone away

思考:真正意义上自己实现的连接池,是长期与数据库服务器链接起链接的。如何建立起链接呢。就是定期发送心跳包。通过心跳包与服务器进行通信。

如果没有发送心跳包,则会被数据库服务器断掉这个链接。因为长时间没有通信的链接,要断掉。

待完善

MYSQL has gone away的解释:

http://database.51cto.com/art/201105/261107.htm
时间: 2024-07-28 20:22:17

使用mysql的长连接的相关文章

《MySQL DBA修炼之道》——1.5 长连接、短连接、连接池

1.5 长连接.短连接.连接池 当数据库服务器和客户端位于不同的主机时,就需要建立网络连接来进行通信.客户端必须使用数据库连接来发送命令和接收应答.数据.通过提供给客户端数据库的驱动指定连接字符串后,客户端就可以和数据库建立连接了.可以查阅程序语言手册来获知通过何种方式使用短连接.长连接.1.5.1 短连接 短连接是指程序和数据库通信时需要建立连接,执行操作后,连接关闭.短连接简单来说就是每一次操作数据库,都要打开和关闭数据库连接,基本步骤是:连接→数据传 输→关闭连接. 在慢速网络下使用短连接

MySQL sleep进程连接过多卡住了问题解决办法

MySQL sleep进程连接过多原因分析 当php的页面执行结束时,会自动释放掉一切.相信很多人都跟我想的一样.但事实证明并不是这样.比如session就不会随着页面执行完毕而释放. php的垃圾回收机制,其实只针对于php本身.对于mysql,php没权利去自动去释放它的东西.如果你在页面执行完毕前不调用mysql_close(),那么mysql那边是不会关闭这个连接的.如果你是用的是pconnect方式,即使你在页面执行完毕前调用mysql_close(),也无法另mysql关闭这个连接

请教hibernate在BAE中的数据库连接池长连接问题

问题描述 因为BAE不支持长连接,所以默认的设置虽然在本机上跑的好好的,可是一上传跑了没多久就会出现下面这个错误Causedby:org.hibernate.exception.JDBCConnectionException:couldnotexecutequeryatorg.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:97)atorg.hibernate.exception.JDBCException

数据库中的长连接和短连接区别分析

什么是长连接? 其实长连接是相对于通常的短连接而说的,也就是长时间保持客户端与服务端的连接状态. 通常的短连接操作步骤是: 连接->数据传输->关闭连接: 而长连接通常就是: 连接->数据传输->保持连接->数据传输->保持连接->----->关闭连接: 这就要求长连接在没有数据通信时,定时发送数据包,以维持连接状态,短连接在没有数据传输时直接关闭就行了 什么时候用长连接,短连接? 长连接主要用于在少数客户端与服务端的频繁通信,因为这时候如果用短连接频繁通信

浅析关于PHP中Sphinx长连接问题

SphinxClient::open (PECL sphinx >= 1.0.3) SphinxClient::open - 建立到搜索服务端的持久连接 说明 public bool SphinxClient::open ( void ) 建立到搜索服务端的持久连接. 参数 此函数没有参数. 返回值 成功时返回 TRUE, 或者在失败时返回 FALSE. 今日在做PHP系统代码优化时,对sphinx的长连接做了一些分析发现php的sphinx api并不是我们想象中的那样会在php-fpm的fa

长连接-c#腾讯企业邮箱二次开发实现新邮件提醒

问题描述 c#腾讯企业邮箱二次开发实现新邮件提醒 新邮件提醒,需要维持长连接,图片是API文档关于长连接的描述, 但是我获取到token,传入参数ver=0,返回错误,无效的请求,有做过这个功能的吗,求助啊!! private bool GetPostData(string url, string pars, ref string json) { System.GC.Collect(); //url=请求的地址,pars= "var=0" string ret = "&quo

利用socket长连接做信息报警提示

问题描述 利用socket长连接做信息报警提示 现在在做一个项目,需要用服务器推送技术做一个报警提示,就是只要有没有处理的信息显示,就自动报警

php长连接,奏是这么简单

说到长链接大家肯定不陌生,就是复用一个链接持续不断的进行数据交互,它不像那些一夜情似的服务,需要频繁的打开和关闭链接,效率低的同时还增加了业务的复杂度.在裆下很多互联网业务场景都需要长连接的支持,比如:游戏.聊天.信息推送等等等,今天我们就一步一步来揭秘php长连接的玩法.我相信任何一项技术的实施都是因为业务场景的需要,所以这次我们还拿聊天室说事儿. 0x00 初试牛刀 记得以前用php写聊天室还是用polling的方式,毫无疑问,一提到polling,肯定会有人说long polling,没错

Delphi中多进程解决datasnap支持的tcp长连接数量少的问题

对于实时采集数据的项目,应用场景比如是这样的:5000客户端,每个客户端每隔500MS要给服务器上传一次数据. 大家知道,像INDY这种阻塞型的通信控件,所能支持的TCP长连接的一般地不能超过1000的数量(如果想要维持稳定运行的话). 原因是大家都晓得的,阻塞方式会为每一个SOCKET连接创建一个新的线程为之服务,而WINDOWS单个进程理论上允许最多的线程数量是2048个, 实际当中要少得多才行. 有人说可以用WINDOWS的IOCP通信模型解决,诚然!但IOCP编程过于复杂. 有人说,可以