7

我正在编写一个应用程序,它需要在应用程序层内进行主/从切换。就像现在一样,我在创建映射器时实例化 Zend_Db_Table 对象,然后将 setDefaultAdapter 设置为从属。

现在在基本映射器类中,我有以下方法:

public function useWriteAdapter()
{
    if(Zend_Db_Table_Abstract::getDefaultAdapter() != $this->_writeDb)
    {
        Zend_Db_Table_Abstract::setDefaultAdapter($this->_writeDb);
        $this->_tableGateway = new Zend_Db_Table($this->_tableName);
    }
}

我需要对此进行全面检查。我不认为开销太大,我只是怀疑必须有更好的方法。

4

3 回答 3

3

An object of type Zend_Db_Table_Row_Abstract remembers what Table object produced it. But you can change the associated Table before you call save().

$readDb = Zend_Db::factory(...);  // replica
$writeDb = Zend_Db::factory(...); // master
Zend_Db_Table::setDefaultAdapter($readDb);

$myReadTable = new MyTable(); // use default adapter
$myWriteTable = new MyTable($writeDb);

$row = $myTable->find(1234)->current();

$row->column1 = 'value';

$row->setTable($myWriteTable);

$row->save();
于 2009-12-03T20:31:40.623 回答
1

您扩展的执行启动的基类之类的东西怎么样?

class My_Db_Table extends Zend_Db_Table
{
    function init() 
    {
        if (....) {
           // set the default adaptor to the write-DB-master
        }
        parent::init();
    }
}
// all your models then extend My_Db_Table instead of Zend_Db_Table
于 2009-12-01T20:50:59.643 回答
0

尽管您很可能已经想出了一个解决方案,但我仍然会按照我的做法发布:我一直在寻找相同问题的解决方案,并想出了将其逻辑放入适配器的想法。

我扩展了 Zend_Db_Adapter_Abstract 并添加了布尔属性 $writes。我也为它添加了公共 getter 和 setter 方法。

我的适配器保存了两种不同的数据库配置/连接:一种用于主服务器(用于写入),另一种用于从服务器(用于读取)。(实际上这不是一种配置,而是很多配置,所以我有一种按重量随机选择的主从池。)

现在我执行以下操作:在执行查询之前,必须将 $writes 设置为 true 或 false。在方法 connect() 中,适配器根据 $writes 的值连接或使用正确的连接。

于 2012-07-18T09:24:59.980 回答