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
  • 相关阅读:
    leetcode 86. Partition List
    leetcode 303. Range Sum Query
    leetcode 1310. XOR Queries of a Subarray
    leetcode 1309. Decrypt String from Alphabet to Integer Mapping
    leetcode 215. Kth Largest Element in an Array
    将numpy.ndarray写入excel
    leetcode 1021 Remove Outermost Parentheses
    leetcode 1306. Jump Game III
    leetcode 1305. All Elements in Two Binary Search Trees
    ICCV2019 oral:Wavelet Domain Style Transfer for an Effective Perception-distortion Tradeoff in Single Image Super-Resolution
  • 原文地址:https://www.cnblogs.com/ldms/p/5241614.html
Copyright © 2011-2022 走看看