Как использовать настройки доктрины Master / Slave из команд Symfony2 Console

Я использую конфигурацию 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 должно быть то, как и когда он выбирает подчиненный или ведущий.

  • выбирает Slave, если Master никогда не был выбран раньше и ТОЛЬКО, если используется 'getWrappedConnection' или 'executeQuery'.
  • Мастер выбрал, когда « exec », « executeUpdate », « insert », « delete », « update », « createSavepoint », « releaseSavepoint », « beginTransaction », « rollback », « commit », « query » или « prepare », называется.
  • Если мастер был выбран один раз во время жизни соединения, он всегда будет выбран позже.
  • Одно подчиненное соединение выбирается случайным образом во время запроса.

( API MasterSlaveConnection )