如何一次更改所有模型的useDbConfig,但可以选择在我想要同一操作的任何时候更改它。
有一些插件可以查看查询,当它包含UPDATE,INSERT等时...它将使用master数据库,而选择它使用slave ..
但问题是从属数据库总是在主服务器之后,如果有0.5秒的延迟,则INSERT / UPDATE之后的SELECT可能无法找到刚更新的内容。
现在奴隶比主人落后0.05秒,所以这很快..但它落后了!如果以某种方式延迟0.5秒,这可能是一个问题。
当我有这样的shell时:
ManagementShell 函数doHeavyCalculation($ users){
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)
}
}
当我这样做时,它只会更改模型User的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&#39 ;;所有模型都使用slave1作为数据库连接。
并使用$ this-> User-> setGlobalDatabase =' master&#39 ;;现在使用Master来处理所有模型/查询。但是我可以在sql调试日志中看到执行sql查询的服务器。
(master) 393 queries took .. ms
INSERT ...
SELECT ...
UPDATE ...
..
(slave1) 1351 queries took .. ms
SELECT ...
SELECT ...
..
还有一个选项可以更改当前的mysql连接。但后来我不知道slave1和master上发生了什么,因为在sql debug输出中只显示第一个连接(master)
我正在使用CakePHP 2.6.1
答案 0 :(得分:0)
如果要全局更改数据库,而不是尝试更改每个模型的数据库,我建议您更改AppModel的数据库,或直接更改DATABASE_CONFIG的$ default属性。无论哪种方式都会为你节省很多,试图弄清楚哪个模型指向哪里,两者都会有相同的最终结果。