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

タイプのオブジェクトは、Zend_Db_Table_Row_AbstractTableオブジェクトがそれを生成したものを記憶しています。ただし、を呼び出す前に、関連するテーブルを変更できます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を追加しました。パブリックゲッターメソッドとセッターメソッドも追加しました。

私のアダプターは、2つの異なるデータベース構成/接続を保存します。1つはマスター用(書き込み用)、もう1つはスレーブ用(読み取り用)です。(実際には、1つの構成ではなく、多くの構成であるため、重量によってランダムに選択されるマスターと軟膏のプールのようなものがあります。)

ここで、次のことを行います。クエリを実行する前に、$writesをtrueまたはfalseに設定する必要があります。connect()メソッドでは、アダプターは$writesの値に応じて正しい接続を接続または使用します。

于 2012-07-18T09:24:59.980 に答える