使用mysql的长链接

使用mysql的长链接php


 


 


有个资料看得我云里雾里的。如今用本身的言语来总结一下,写文字,可以加深本身的理解。也会在写的过程当中帮助本身发现理解方面瑕疵,继续查资料求证。java


 


 


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


 


长链接就能够避免每次请求都建立链接的开销,节省了时间和IO消耗。sql


 


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


 


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


 


my.conf中的函数


wait_timeout=2880000sqlserver

interactive_timeout = 2880000性能


 


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


 


启发: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

相关文章
相关标签/搜索