我目前正在开展一个项目,我们选择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.');
}
}
}
}
答案 0 :(得分: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类,但是按照你的建议包含我自己的open方法。
可以非常轻松地在数据库之间切换(例如Multiple-database support in Yii),我确信你可以将它集成到自定义open()
方法中打开数据库连接的try / catch中吗?