Heim > Backend-Entwicklung > PHP-Tutorial > Doctrine implementiert einen automatischen Wiederverbindungsmechanismus zur MySQL-Datenbank

Doctrine implementiert einen automatischen Wiederverbindungsmechanismus zur MySQL-Datenbank

零到壹度
Freigeben: 2023-03-23 07:20:02
Original
1854 Leute haben es durchsucht

Dieser Artikel stellt hauptsächlich die Doktrin zur Realisierung des automatischen Wiederverbindungsmechanismus der MySQL-Datenbank vor. Der Herausgeber hält ihn für recht gut, daher werde ich ihn jetzt mit Ihnen teilen und als Referenz verwenden. Folgen wir dem Herausgeber, um einen Blick darauf zu werfen.

不知道大家有没有碰到就是mysql有的时候会八小时不使用的话自动断开连接,这样会导致我们的请求失败,项目访问报错,数据库断开,这个时间要是失效了,那我们该怎么办呢?我们使用的是doctrine-dbal,所以那我们就写一套自动重连的机制吧!话不多bb,直接上代码。 <br>
Doctrine implementiert einen automatischen Wiederverbindungsmechanismus zur MySQL-Datenbank

<?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;
        }
    }

}
Nach dem Login kopieren

Auf diese Weise decken die beiden aktuellen Methoden die ursprüngliche Methode ab Der Verbindungsmechanismus ist einfach und unkompliziert. Nach dem Testen haben wir festgestellt, dass MySQL beim Neustart automatisch wieder verbunden wird. Der Grund dafür ist, dass es eine unterste Ebene hat, $this->connect(). Wir müssen also keine Angst haben

Das obige ist der detaillierte Inhalt vonDoctrine implementiert einen automatischen Wiederverbindungsmechanismus zur MySQL-Datenbank. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage