2009-12-01 4 views
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); 
    } 
} 

내가이의 전성 검사가 필요합니다

이제 기본 매퍼 CLASSE의 내부에, 나는 다음과 같은 방법이있다. 오버 헤드가 너무 많다고 생각하지 않습니다. 더 나은 방법이 있어야한다고 생각합니다.

답변

3

유형 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(); 
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

DB 어댑터를 즉시 전환 할 수 있어야하므로이 작업이 가능한지 확실하지 않습니다. – Pro777

0

당신은 아마 이미 솔루션을 함께했다하지만 난 아직도 내가했던 방법을 게시 할 예정입니다 답변을 것이라고 생각 this article을 발견했다 솔루션에 대한 문제를 해결하고 그 논리를 Adapter에 넣으려는 아이디어가 떠올랐다.

나는 Zend_Db_Adapter_Abstract를 확장하고 부울 속성 $ writes를 추가했습니다. 공용 getter 및 setter 메서드도 추가했습니다.

내 어댑터는 마스터 (쓰기 용)와 슬레이브 (읽기 용)에 각각 다른 두 가지 데이터베이스 구성/연결을 저장합니다. (사실 그것은 하나의 설정이 아니지만 많은 것들이있어서 무작위로 선택되는 마스터 풀의 종류가 있습니다.)

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