我写这需要主/从开关的应用层内发生的应用程序。因为它是现在,我实例化创建映射器的Zend_Db_Table类对象,然后setDefaultAdapter的奴隶。

现在基座映射器CLASSE的内部,我有以下方法:

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

我需要在此执行健全性检查。我不觉得开销太大,我只是怀疑,必须有一个更好的办法。

有帮助吗?

解决方案

Zend_Db_Table_Row_Abstract的目的会记住表对象产生它。但是,你叫save()之前,您可以更改相关的表。

$readDb = Zend_Db::factory(...);  // slave
$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();

其他提示

如何像一个基类,您可以扩展执行启动?

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

虽然你很可能已经想出了一个解决方案,我仍然会后我做了它的方式: 我一直在寻找用于相同问题的解决方案和想出了主意,把逻辑为该插入适配器。

我延长了一个Zend_Db_Adapter_Abstract和添加的布尔属性$写入。我加入公共获取和设置方法对于它。

我的适配器可以节省两个不同的数据库的配置/ -connections:一个用于主(用于写入),一个用于从设备(读取)。 (实际上它不是一个配置中但很多,所以我有一种其重量随机选择的主人和药膏的池。)

现在我做到以下几点:在我执行一个查询$写操作必须设置为true或false。在该方法中连接()的适配器连接或使用正确的连接取决于$的值写入。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top