CakePHP Master / Slave按需更改

时间:2015-02-12 10:25:47

标签: cakephp

如何一次更改所有模型的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

1 个答案:

答案 0 :(得分:0)

如果要全局更改数据库,而不是尝试更改每个模型的数据库,我建议您更改AppModel的数据库,或直接更改DATABASE_CONFIG的$ default属性。无论哪种方式都会为你节省很多,试图弄清楚哪个模型指向哪里,两者都会有相同的最终结果。