교리는 mysql 데이터베이스 메커니즘에 대한 자동 재연결을 구현합니다.

零到壹度
풀어 주다: 2023-03-23 07:20:02
원래의
1822명이 탐색했습니다.

이 글은 주로 mysql 데이터베이스 메커니즘의 자동 재연결을 실현하기 위한 교리를 소개합니다. 편집자는 이것이 꽤 좋다고 생각하므로 지금 공유하고 참고용으로 제공하겠습니다. 편집자를 따라가서 살펴봅시다

不知道大家有没有碰到就是mysql有的时候会八小时不使用的话自动断开连接,这样会导致我们的请求失败,项目访问报错,数据库断开,这个时间要是失效了,那我们该怎么办呢?我们使用的是doctrine-dbal,所以那我们就写一套自动重连的机制吧!话不多bb,直接上代码。 <br>
교리는 mysql 데이터베이스 메커니즘에 대한 자동 재연결을 구현합니다.

<?php
namespace WsdServer\Lib\PDO;

use Doctrine\Common\EventManager;

use Doctrine\DBAL\Driver;
use Doctrine\DBAL\Configuration;
use Doctrine\DBAL\DBALException;
use Doctrine\DBAL\Cache\QueryCacheProfile;

use Doctrine\DBAL\Connection AS Connection;


/**
 * A wrapper around a Doctrine\DBAL\Connection that adds features like
 * reconnect
 *
 */
 class WsdConnection extends Connection
 {
    const RECONNECT_MAX_TIMES = 3;  // 最多重试次数

    private $reconnectRetryTimes;    
    
    public function __construct(array $params, Driver $driver, Configuration $config = null,
                                EventManager $eventManager = null)
    {
        parent::__construct($params, $driver, $config, $eventManager);
    }    
    
    /**
     * executeQuery - 支持自动重连机制的封装
     *
     * Executes an, optionally parametrized, SQL query.
     *
     * If the query is parametrized, a prepared statement is used.
     * If an SQLLogger is configured, the execution is logged.
     *
     * @param string $query The SQL query to execute.
     * @param array $params The parameters to bind to the query, if any.
     * @param array $types The types the previous parameters are in.
     * @param \Doctrine\DBAL\Cache\QueryCacheProfile|null $qcp The query cache profile, optional.
     *
     * @return \Doctrine\DBAL\Driver\Statement The executed statement.
     *
     * @throws DBALException
     * @throws \Exception
     */
    public function executeQuery($query, array $params = array(), $types = array(), QueryCacheProfile $qcp = null)
    {
        try {            
             $result = parent::executeQuery($query, $params, $types, $qcp);            
             $this->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()라는 맨 아래 레이어가 있기 때문입니다. 그러니 우리는 두려워할 필요가 없습니다

위 내용은 교리는 mysql 데이터베이스 메커니즘에 대한 자동 재연결을 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!