1

私は現在、新しいフレームワークとして Yii を選択したプロジェクトに取り組んでいます。私は現在、Yii である種の自動データベース フェイルオーバーを実装する最良の方法を見つけようとしています。

現在、CDbConnection クラスの Open 関数をオーバーライドしようとしています。正しい方向に向かっているかどうかはわかりません。

基本的に私がやろうとしているのは、DB接続をチェックし、失敗した場合は別のDBに接続することです. シンプルなコンセプト どこに置けばいいのかわからない。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.');
        }
    }    
}

}

4

1 に答える 1

1

正しい方向のように聞こえます。Yii にそのための機能が組み込まれているかどうかはわかりません。間違っている場合は誰か訂正してください。

私がおそらく試したいのは、頭のてっぺんから、メインの構成ファイルで2つのデータベースを定義することですが、独自のカスタムクラスを使用しています。

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 クラスを拡張させますが、あなたが提案したように、独自の open メソッドを含めます。

データベースを非常に簡単に切り替えることができます (例: Yii での複数データベースのサポートopen())。カスタムメソッドで db 接続を開く try/catch にそれを統合できると思いますか?

于 2012-12-21T16:56:01.930 に答える