CakePHP主/从随需更改

CakePHP主/从随需更改,cakephp,Cakephp,如何一次更改所有模型的useDbConfig,但可以在同一操作中随时更改它 当查询包含UPDATE、INSERT等时,有一些插件可以查看查询。。它将使用主数据库,而对于选择,它将使用从属数据库 但问题是从属数据库总是在主数据库之后,如果延迟0.5秒,则插入/更新后的SELECT可能找不到刚刚更新的内容 现在,从机比主机慢0.05秒,所以速度很快。。但它的背后!如果延迟0.5秒,那可能是个问题 当我有这样一个外壳: 管理壳 函数doHeavyCalculation$用户{ foreach(

如何一次更改所有模型的useDbConfig,但可以在同一操作中随时更改它

当查询包含UPDATE、INSERT等时,有一些插件可以查看查询。。它将使用主数据库,而对于选择,它将使用从属数据库

但问题是从属数据库总是在主数据库之后,如果延迟0.5秒,则插入/更新后的SELECT可能找不到刚刚更新的内容

现在,从机比主机慢0.05秒,所以速度很快。。但它的背后!如果延迟0.5秒,那可能是个问题

当我有这样一个外壳:

管理壳 函数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)
    }
}
当我这样做时,它只更改模型用户的数据库配置,而不更改任何相关模型的数据库配置

现在,用户模型是否有很多关系…我可以像下面这样做…但这是一个永无止境的故事..而不是它应该的方式..肮脏的代码

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调试日志中看到,sql查询是在哪个服务器上执行的

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

(slave1) 1351 queries took .. ms
SELECT ...
SELECT ...
..
还有一个选项可以更改当前的mysql连接,但是我看不到slave1和master上发生了什么,因为在sql调试输出中,它只显示第一个连接主机


我使用的是CakePHP 2.6.1

如果您想全局更改数据库,而不是尝试更改每个模型的数据库,我建议您要么更改AppModel的数据库,要么直接更改database_CONFIG的$default属性。无论哪种方法,都可以节省您大量的时间,让您找出哪个模型指向何处,并且两者都会有同样的结果