繁体   English   中英

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

[英]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之前从未被选中 ,那么只有在使用'getWrappedConnection'或'executeQuery'时才选择Slave。
  • 当' exec ',' executeUpdate ',' insert ',' delete ',' update ',' createSavepoint ',' releaseSavepoint ',' beginTransaction ',' rollback ',' commit ',' query '或' prepare '时, 大师选择叫做。
  • 如果在连接的生命周期中选择了一次master, 那么它将始终被选中。
  • 在请求期间随机选择一个从属连接。

MasterSlaveConnection API

当我正在寻找一种方法来查询我的主人写作或我的奴隶阅读时,我最终得到了这个问题。

这是魔术:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM