Zend Framework 응용 프로그램 계층의 마스터 / 슬레이브 스위치
-
11-09-2019 - |
문제
응용 프로그램 계층 내에서 마스터/슬레이브 스위치가 발생 해야하는 응용 프로그램을 작성하고 있습니다. 지금처럼, 나는 맵퍼를 만드는시 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 ()에서 어댑터는 $ 쓰기 값에 따라 올바른 연결을 연결하거나 사용합니다.