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

tim*_*top 5 php mysql symfony doctrine-orm

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

这在我的应用程序中完美运行,Doctrine2明智地使用slave进行只读查询,master用于写入操作.

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

$em = $this->get('doctrine')->getManager();
var_dump($em->getConnection()->isConnectedToMaster());
Run Code Online (Sandbox Code Playgroud)

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

如果我在一个内部运行此代码也是如此 WebTestCase

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

$em = $this->getContainer()->get('doctrine')->getManager();
var_dump($em->getConnection()->isConnectedToMaster());
Run Code Online (Sandbox Code Playgroud)

isConnectedToMaster()返回true.这意味着主服务器被选为默认服务器.

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

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

回答:感谢nifr让我选择了正确的课程 - 我发现我的问题是因为我正在使用JMS\JobQueueBundle(它将app/console使用的应用程序替换为必须以一种方式连接到MasterSlaveConnection的更改的应用程序/控制台强迫选择"主人").当我评论出来时

use JMS\JobQueueBundle\Console\Application;
Run Code Online (Sandbox Code Playgroud)

app/console我的控制台测试中正确选择了从属.

谢谢

Nic*_*ich 6

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


对于理解的重要的是MasterSlaveConnection应该如何以及何时选择从属或主用。

  • 如果以前从未选择 Master,选择Slave ;只有使用'getWrappedConnection'或'executeQuery'时,才选择Slave 。
  • 主文件在' exec ',' executeUpdate ',' insert ',' delete ',' update ',' createSavepoint ',' releaseSavepoint ',' beginTransaction ',' rollback ',' commit ',' query '或' prepare '时被选择叫做。
  • 如果在连接的有效期内选择了主服务器一次,则此后它将始终被选择。
  • 在请求期间,一次随机选择一个从属连接。

MasterSlaveConnection API