Zend Frameworkのアプリケーション層でのマスター/スレーブスイッチ
-
11-09-2019 - |
質問
私は、アプリケーション層の内部で発生するマスター/スレーブスイッチを必要とするアプリケーションを書いています。それが今であるように、私はマッパーの作成に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);
}
}
私はこの上の健全性チェックを必要としています。私はちょうど良い方法がなければならない疑いがある、オーバーヘッドが多すぎるとは思わない。
解決
型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を拡張し、$を書き込みブール属性を追加しました。私もそれのためのパブリックgetterメソッドとsetterメソッドを追加します。
(書き込み用)マスター用と(読書用)スレーブのための1:私のアダプタは、二つの異なるデータベース構成/ -connectionsが保存されます。 (実際に、それは私が重量によってランダムに選択されているマスターと軟膏のプールのようなものを持っている一つの構成が、多くはありません。)
今、私は次のようにします。私は、クエリ$の書き込みを実行する前に、trueまたはfalseに設定する必要があります。 )の方法では(接続アダプタが接続されているか、$書き込みの値に応じて、右の接続を使用します。