Отработка отказа базы данных Yii при отказе

В настоящее время я работаю над проектом, для которого мы выбрали Yii в качестве нового фреймворка. В настоящее время я пытаюсь найти лучший способ реализовать в Yii автоматическое переключение базы данных при сбое.

В настоящее время я пытаюсь переопределить класс CDbConnection - функция Open. Однако я не уверен, что иду в правильном направлении.

В основном то, что я хочу сделать, - это проверить соединение с БД, и если оно не может подключиться к другой БД. Простая концепция. Я просто не знаю, куда ее девать. Я знаю, что есть более эффективные способы сделать это с помощью mysqlnd_ms, но он еще не настроен на серверах, которые мы используем, поэтому нужно придумать способ сделать это в Yii. Любая помощь приветствуется. -DA

Это то, что у меня есть до сих пор Мысли?

class DaDbConnection extends CDbConnection{

public $dbConnectTries = 6;
public $numDatabases = 3;
private $_tries =0;
private $_db = 1;

/*
 * Extends CDbConnection open() method
 * Tries to connect to database connections setup in config/main.php up to 
 * the value of $dbConnectionTries or a connection is successful
 * @throws CException If it can not connect to any DBs
 */
protected function open()
{
    try{
        //try to connect to the default DB
        parent::open();

    }catch(Exception $e){
        if($this->_tries < $this->dbConnectTries){

            //If there aren't anymore DBs to try we must start over from the first
            if($this->_db >= $this->numDatabases){
                $tryDb = 'db';
                $this->_db = 0;
            }else{
               $tryDb = 'db'.$this->_db;
            }

            $this->_db++;
            $this->_tries++;

            $this->connectionString = Yii::app()->$tryDb->connectionString;
            $this->username = Yii::app()->$tryDb->username;
            $this->password = Yii::app()->$tryDb->password;
            $this->open();
        }else{
            throw new CDbException('Could Not Connect to a DB.');
        }
    }    
}

}


person Andrew Mallonee    schedule 21.12.2012    source источник


Ответы (1)


Похоже, в правильном направлении. Я не уверен, что в Yii есть что-нибудь для этого, пожалуйста, поправьте меня, если я ошибаюсь.

То, что я, вероятно, попробую, просто вне моей головы, - это определить две базы данных в моем основном файле конфигурации, но с моим собственным пользовательским классом;

return array(
    ...
    'components' => array(
        'db' => array(
            'connectionString' => 'mysql:host=dbserver1;dbname=my1db',
            ...
            'class'            => 'MyCDbConnection',
            ...
        ),
        'dbBackup' => array(
            'connectionString' => 'mysql:host=dbserver2;dbname=my2db',
            ...
            'class'            => 'MyCDbConnection',
        ),
        ...
    ),
);

Затем я бы сделал так, чтобы класс MyCDbConnection расширил основной класс CDbConnection, но включил мой собственный открытый метод, как вы предложили.

Можно довольно легко переключаться между базами данных (например, Multiple-database поддержка в Yii), и я уверен, что вы могли бы интегрировать это в попытку / уловку открытия соединения с базой данных в вашем пользовательском методе open()?

person Stu    schedule 21.12.2012
comment
Для полноты картины вам необходимо переопределить getDbConnection () - person ernie; 21.12.2012
comment
Я добавил свой код выше, я просто переключаю строку подключения, которую CDbConnection использует, если не может подключиться. - person Andrew Mallonee; 22.12.2012