欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

PHP doctrine 数据库mysql自动重连机制示例讲解

程序员文章站 2022-09-15 23:30:09
最可气的是mysql有的时候会八小时不使用的话自动断开连接,这样会导致我们的请求失败,项目访问报错,数据库断开 这个时间要是失效了,那我们该怎么办呢?我们使用的是doctri...

最可气的是mysql有的时候会八小时不使用的话自动断开连接,这样会导致我们的请求失败,项目访问报错,数据库断开

PHP doctrine 数据库mysql自动重连机制示例讲解

这个时间要是失效了,那我们该怎么办呢?我们使用的是doctrine-dbal,所以那我们就写一套自动重连的机制吧!话不多bb,直接上代码。

reconnectRetryTimes = 0;
            return $result;
        } catch (DBALException $dex){
            if ( $dex->getErrorCode() == 2006 ) {
                if ($this->reconnectRetryTimes <= WsdConnection::RECONNECT_MAX_TIMES) {
                    $this->reconnectRetryTimes++;
                    secho("ORM-executeQuery", "MySQL Reconnect...("
                        . $this->reconnectRetryTimes . "/" . WsdConnection::RECONNECT_MAX_TIMES . ")");
                    $this->close();
                    return $this->executeQuery($query, $params, $types, $qcp);
                }
            }
            throw $dex;
        } catch (\Exception $ex) {
            throw $ex;
        }
    }


    /**
     * executeUpdate - 支持自动重连机制的封装
     *
     * Executes an SQL INSERT/UPDATE/DELETE query with the given parameters
     * and returns the number of affected rows.
     *
     * This method supports PDO binding types as well as DBAL mapping types.
     *
     * @param string $query The SQL query.
     * @param array $params The query parameters.
     * @param array $types The parameter types.
     *
     * @return integer The number of affected rows.
     *
     * @throws DBALException
     * @throws \Exception
     */
    public function executeUpdate($query, array $params = array(), array $types = array())
    {
        try {
            $result = parent::executeUpdate($query, $params, $types);
            $this->reconnectRetryTimes = 0;
            return $result;
        } catch (DBALException $dex){
            if ( $dex->getErrorCode() == 2006 ) {
                $this->reconnectRetryTimes++;
                if ($this->reconnectRetryTimes <= WsdConnection::RECONNECT_MAX_TIMES) {
                    secho("ORM-executeQuery", "MySQL Reconnect...("
                        . $this->reconnectRetryTimes . "/" . WsdConnection::RECONNECT_MAX_TIMES . ")");
                    $this->close();
                    parent::executeUpdate($query, $params, $types);
                }
            }
            throw $dex;
        } catch (\Exception $ex) {
            throw $ex;
        }
    }

}

这样用现在的两个方法覆盖了它原来本身的,这样从连机制简简单单的好了,

测试了一波,发现我们 kill mysql,在重新起来的时候他会自动重新连接,原因是它本身的底层有一个,$this->connect()。所以我们不用怕了