2015-02-12 1 views
1

Как я могу изменить useDbConfig для всех моделей сразу, но у меня есть возможность изменить это в любое время, когда я захочу при одном и том же действии.CakePHP Master/Slave изменение по требованию

Есть некоторые плагины, которые смотрят на запрос, если он содержит UPDATE, INSERT и т.д .. он будет использовать основную базу данных, и выбирает он использует рабов ..

Но проблема в том, что подчиненные базы данных всегда позади ведущего, и если есть задержка 0,5 секунды, возможно, что SELECT после INSERT/UPDATE не сможет найти то, что только что обновлено.

В настоящее время ведомые устройства находятся на 0,05 секунды позади ведущего устройства, поэтому это быстро .. но его позади! и если каким-то образом задержка 0,5 секунды может быть проблемой.

Когда я иметь оболочку, как это:

ManagementShell функция doHeavyCalculation ($ пользователей) {

foreach($users as $user) { 
     $this->User->useDbConfig = 'slave1'; 
     // Do heavy sql calulation (use slave 1 db) 

     $this->User->useDbConfig = 'slave2'; 
     // Do heavy sql subcalulations (use slave 2 db) 

     $this->User->useDbConfig = 'master'; 
     // write data + some find queries (use master db) 
    } 
} 

Когда я сделать это таким образом, он изменяет только databaseconfig для модели пользователя, и не для каких-либо связанных моделей.

Теперь делает модель пользователя есть много отношений .. Я могу сделать это, как показано ниже .. но это никогда не заканчивается история .. а не так, как надо .. грязный код ..

foreach($users as $user) { 

    $this->User->useDbConfig = 'slave1'; 
    $this->User->UserRelation->useDbConfig = 'slave1'; 
    $this->User->Group->SubGroupModel->useDbConfig = 'slave1'; 
    $this->User->Profile->useDbConfig = 'slave1'; 
    $this->User->Profile->Country->useDbConfig = 'slave1'; 
    $this->User->.........->useDbConfig = 'slave1'; 
    // Do heavy sql calulation (use slave1 db) 

    $this->User->useDbConfig = 'master'; 
    $this->User->UserRelation->useDbConfig = 'master'; 
    $this->User->Group->SubGroupModel->useDbConfig = 'master'; 
    $this->User->Profile->useDbConfig = 'master'; 
    $this->User->Profile->Country->useDbConfig = 'master'; 
    $this->User->.........->useDbConfig = 'master'; 
    // write data + some find queries (use master db) 

} 

Мое идеальное решение было бы простым вызовом $ this-> User-> setGlobalDatabase = 'slave1'; Все модели используют slave1 в качестве подключения к базе данных.

И с $ this-> User-> setGlobalDatabase = 'master'; Теперь используйте Master для всех моделей/запросов. Но я могу видеть в sql debug log на том, на каком сервере выполняются запросы sql.

(master) 393 queries took .. ms 
INSERT ... 
SELECT ... 
UPDATE ... 
.. 

(slave1) 1351 queries took .. ms 
SELECT ... 
SELECT ... 
.. 

Существует также возможность изменить текущее соединение mysql. Но тогда я не вижу, что случилось на SLAVE1 и на мастера, потому что в SQL выход отладки показывает только первое соединение (мастер)

Я использую CakePHP 2.6.1

ответ

0

Если вы хотите изменить базу данных глобально, вместо того, чтобы пытаться изменить базу данных каждой модели, я предлагаю вам либо изменить базу данных AppModel, либо напрямую изменить свойство DATABASE_CONFIG $ default. В любом случае вы сэкономите много усилий, чтобы выяснить, какая модель указывает, где и как будет иметь тот же конечный результат.

Смежные вопросы