문제

응용 프로그램 계층 내에서 마스터/슬레이브 스위치가 발생 해야하는 응용 프로그램을 작성하고 있습니다. 지금처럼, 나는 맵퍼를 만드는시 zend_db_table 객체를 인스턴스화 한 다음 슬레이브에 refaultAdapter를 설정합니다.

이제 기본 맵퍼 클래스 내부에는 다음과 같은 방법이 있습니다.

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를 확장하고 Boolean 속성 $ writes를 추가했습니다. 나는 그것을 위해 공개 getter와 setter 방법을 추가했습니다.

내 어댑터는 두 가지 다른 데이터베이스 구성/-연결을 저장합니다. 하나는 마스터 (쓰기)와 슬레이브 (읽기)를위한 것입니다. (실제로는 하나의 구성이 아니지만 많은 사람들이 무작위로 무작위로 선택되는 마스터와 살을 가지고 있습니다.)

이제 다음을 수행합니다. 쿼리를 실행하기 전에 $ 쓰기는 true 또는 false로 설정해야합니다. 메소드 Connect ()에서 어댑터는 $ 쓰기 값에 따라 올바른 연결을 연결하거나 사용합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top