zoukankan      html  css  js  c++  java
  • 使用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
  • 相关阅读:
    白话LINQ系列2以代码演进方式学习LINQ必备条件
    《Entity Framework 6 Recipes》中文翻译系列 (9) 第二章 实体数据建模基础之继承关系映射TPH
    Linq To Sqlite 一一二二
    《Entity Framework 6 Recipes》中文翻译系列 (10) 第二章 实体数据建模基础之两实体间Isa和Hasa关系建模、嵌入值映射
    《Entity Framework 6 Recipes》中文翻译系列 (14) 第三章 查询之查询中设置默认值和存储过程返回多结果集
    《Entity Framework 6 Recipes》中文翻译系列 (13) 第三章 查询之使用Entity SQL
    白话LINQ系列1什么是LINQ?
    《Entity Framework 6 Recipes》翻译系列 (3) 第二章 实体数据建模基础之创建一个简单的模型
    JS 实现trim()
    mysql表切换引擎的几种方法
  • 原文地址:https://www.cnblogs.com/ldms/p/5241614.html
Copyright © 2011-2022 走看看