[英]How to use Master/Slave doctrine2 configurations from Symfony2 Console commands
我在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。 这意味着主服务器被选为默认服务器。
我无法找到如何从控制台命令停止默认连接为master。 这意味着如果我想从控制台运行一些非关键的,繁重的数据处理任务 - 它们都会击中主(坏)而不是其中一个从属(好)。
任何人都知道如何让Doctrine2默认从控制台使用奴隶? 或者知道为什么它总是默认为主人?
回答:感谢nifr让我选择了正确的课程 - 我发现我的问题是因为我正在使用JMS \\ JobQueueBundle(它将app / console使用的应用程序替换为必须以一种方式连接到MasterSlaveConnection的更改的应用程序/控制台强迫选择“主人”)。 当我评论出来时
use JMS\JobQueueBundle\Console\Application;
在app/console
,在我的控制台测试中正确选择了从属设备。
谢谢
您必须确保您的命令不会调用任何允许doctrine选择主连接的操作。
了解MasterSlaveConnection
重要之处应该是它如何以及何时选择从站或主站。
当我正在寻找一种方法来查询我的主人写作或我的奴隶阅读时,我最终得到了这个问题。
这是魔术:
写操作(使用master): $em->getConnection->executeUpdate(...);
读取操作(使用从属): $em->getConnection->executeQuery(...);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.