使用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-10-09 09:44:27

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

PHP和mysql的长连接

关于 PHP MySQL 长连接.连接池的一些探索 PHP连接MySQL的方式,用的多的是mysql扩展.mysqli扩展.pdo_mysql扩展,是官方提供的.php的运行机制是页面执行完会释放所有该php进程中的所有资源的,如果有多个并发访问本地的测试页面 http://127.0.0.1/1.php 根据php跟web服务器的不同,会开相应的线程或者进程去处理该请求,请求完了会释放结果的.也就是php无法从语言层面从页面到页面之间传递一些数据,但是mysql_pconnect跟pdo中的A

有关PHP不利于和MYSQL建立长连接的原因

http://www.tuicool.com/articles/iUrERn2 http://rango.swoole.com/archives/265

PHP-数据库长连接mysql_pconnect的细节

PHP的MySQL持久化连接,美好的目标,却拥有糟糕的口碑,往往令人敬而远之.这到底是为啥么.近距离观察后发现,这家伙也不容易啊,要看Apache的脸色,还得听MySQL指挥. 对于作为Apache模块运行的PHP来说,要实现MySQL持久化连接,首先得取决于Apache这个web服务器是否支持Keep-Alive. Keep-Alive Keep-Alive是什么东西?它是http协议的一部分,让我们复习一下没有Keep-Alive的http请求,从客户在浏览器输入一个有 效url地址开始,浏

mysql长连接与短连接

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

mysql长连接和短连接

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

mysql长连接和短连接的问题 转

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

mysql长连接

长连接是干嘛的:  它是做连接复用的: 在openresty中的lua-resty-mysql 里 connect方法去连接mysql时会去ngx_lua cosocket连接池中寻找是否有可用连接 如果有就直接复用: 如果没有就与mysql建立新连接,连接成功后立即将这个连接放入ngx_lua cosocket连接池中. 本人用ngx-lua + mysql 做的一个测试 开启长连接: [[email protected] ~]#  webbench -c 100 -t 60 "http://

mysql长连接和短连接的问题

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

Loadrunner_http长连接设置

最近协助同事解决了几个问题,也对loadrunner的一些设置加深了理解,关键是更加知其所以然. ljonathan http://www.51testing.com/html/48/202848-241574.html 1. loadrunner_internet运行时设置 总览: 2. 中文乱码_设置自动字符集转换 3.loadrunner_连接下载超时_tcp是否使用长连接设置 帮助文档中的说明: 随后在脚本中进行了不同的设置,进行了结果验证: 3.1 默认值:设置 Keep-Alive