Я использую конфигурацию Master / Slave Doctrine2 в Symfony2 для масштабирования моего приложения через одну основную базу данных и несколько ведомых устройств только для чтения (реплицированных).
Это отлично работает из моего приложения, а Doctrine2 разумно использует подчиненный для запросов только для чтения и мастер для операций записи.
Если в одном из моих контроллеров я написал:
$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 использовать подчиненный по умолчанию с консоли? Или знаете, почему он всегда дефолт мастер?
ANSWERED: Благодаря nifr, который задал мне правильный курс, я обнаружил, что моя проблема связана с тем, что я использовал JMS \ JobQueueBundle (который заменяет приложение, используемое приложением / консолью, измененным, которое должно подключаться к MasterSlaveConnection таким образом, чтобы заставляет выбрать «мастер»). Когда я прокомментировал
use JMS\JobQueueBundle\Console\Application;
в app/console
ведомое устройство было правильно выбрано в моем консольном тесте.
благодаря
Вы должны убедиться, что ваша команда не вызывает никаких действий, которые позволяют доктрине выбирать главное соединение.
Важным для понимания MasterSlaveConnection
должно быть то, как и когда он выбирает подчиненный или ведущий.
( API MasterSlaveConnection )