如何使用Symfony2控制台命令中的Master / Slave doctrine2配置

时间:2014-02-27 12:24:21

标签: php mysql symfony doctrine-orm

我正在使用Symfony2中的Doctrine2主/从配置来跨单个主数据库和几个只读(复制)从属扩展我的应用程序。

这完全适用于我的应用程序,Doctrine2明智地使用slave进行只读查询,master用于写操作。

如果在我的一个控制器中,我写道:

$em = $this->get('doctrine')->getManager();
var_dump($em->getConnection()->isConnectedToMaster());

isConnectedToMaster()返回false - 我希望自从奴隶默认连接以来。

如果我在WebTestCase

中运行此代码,情况也是如此

但是,如果我在Symfony控制台命令(ContainerAwareCommand)中编写完全相同的代码:

$em = $this->getContainer()->get('doctrine')->getManager();
var_dump($em->getConnection()->isConnectedToMaster());

isConnectedToMaster()返回true。这意味着主机被选为默认值。

我无法找到如何从控制台命令停止默认连接。这意味着如果我想从控制台运行一些非关键的,繁重的数据处理任务 - 它们都会击中主(坏)而不是其中一个从属(好)。

任何人都知道如何让Doctrine2默认从控制台使用奴隶?或者知道为什么它总是默认为主人?

回答:感谢nifr让我选择了正确的课程 - 我发现我的问题是因为我使用的是JMS \ JobQueueBundle(它取代了app / console使用的应用程序,其中包含一个必须连接到MasterSlaveConnection的更改的应用程序/控制台)一种迫使“主人”被选中的方式。当我评论

use JMS\JobQueueBundle\Console\Application;

app/console中,在我的控制台测试中正确选择了从属设备。

由于

2 个答案:

答案 0 :(得分:4)

您必须确保您的命令不会调用任何让doctrine选择主连接的操作。


了解MasterSlaveConnection的重要性应该是它如何以及何时选择奴隶或主人。

  • 选择Slave如果Master 从未被选中之前和仅在使用'getWrappedConnection'或'executeQuery'时。
  • 主人在'执行','执行更新','插入','删除'时选择, ' update ',' createSavepoint ',' releaseSavepoint ',' beginTransaction ',' rollback < / em>','提交','查询'或'准备'被调用。
  • 如果在连接的生命周期内选择了一次 ,那么之后将始终选择它。
  • 在请求期间随机选择一个从属连接。

MasterSlaveConnection API

答案 1 :(得分:0)

当我正在寻找一种方法来查询主笔迹或查询从属笔迹时,我最终遇到了这个问题。

这是魔术:

  • 写入操作(使用母版):$em->getConnection->executeUpdate(...);

  • 读取操作(使用从属设备):$em->getConnection->executeQuery(...);