2009-12-01 23 views
7

我正在編寫一個應用程序,要求主/從開關在應用程序層內發生。就像現在一樣,我在創建映射器時實例化一個Zend_Db_Table對象,然後將setDefaultAdapter設置爲從器件。Zend Framework應用程序層中的主/從開關

現在基本映射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); 
    } 
} 

我需要在這一個全面的檢查。我不認爲開銷太大,我只是懷疑必須有更好的方法。

回答

3

Zend_Db_Table_Row_Abstract類型的對象會記住Table對象產生的對象。但您可以在致電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(); 
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 
+0

我仍然需要能夠動態切換數據庫適配器,所以我不確定這是否可行。 – Pro777 2009-12-02 03:18:41

0

雖然你很可能已經想出了一個解決方案,我仍然會後我做的方式:我一直在尋找一個 同樣的問題的解決方案,並提出了把它的邏輯放入適配器的想法。

我擴展了Zend_Db_Adapter_Abstract並添加了布爾屬性$ writes。我也爲它添加了公共getter和setter方法。

我的適配器保存兩個不同的數據庫配置/連接:一個用於主機(用於寫入)和一個用於從機(用於讀取)。 (其實這不是一種配置,但很多,所以我有一種主人和隨機選擇的重量池)

現在我執行以下操作:在執行查詢之前$寫入必須設置爲true或假。在connect()方法中,根據$ writes的值,適配器連接或使用正確的連接。

相關問題