2014-02-27 29 views
5

我在Symfony2中使用Doctrine2主/從配置來在單個主數據庫和多個只讀(複製)從服務器上擴展我的應用程序。如何使用Symfony2控制檯命令中的主/從doctrine2配置

這在我的應用程序中完美工作,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在控制檯中默認使用slave?或者知道爲什麼總是默認主人?

回答:感謝nifr讓我走上了正確的道路 - 我發現我的問題是因爲我使用的是JMS \ JobQueueBundle(它將應用程序/控制檯所用的應用程序替換爲必須連接到MasterSlaveConnection以強制選擇「主人」的方式)。當我在app/console註釋掉

use JMS\JobQueueBundle\Console\Application; 

,從正確地在我的控制檯測試選擇。

感謝

回答

3

你必須確保你的命令不調用,讓學說選擇主任何行動。


重要的是理解MasterSlaveConnection應該是如何以及何時挑選奴隸或主人。

  • 挑選奴隸,如果主,並且只有「getWrappedConnection」或「的executeQuery」在使用之前是從來沒有挑。'EXEC' 當
  • 大師挑, '的executeUpdate', '插入', '刪除', '更新', 'createSavepoint', '了releaseSavepoint',「的BeginTransaction」, '回滾', '提交', '查詢' 或 '製備' 是卡勒d。
  • 如果主人在連接的整個生命週期中被挑選一次之後總是會被挑選出來。
  • 一個從站連接在請求期間隨機選取一次。

MasterSlaveConnection API

+0

我的觀點是,即使在一個「空」命令 - 即什麼也不做除了得到了EntityManager並詢問是否已連接到主設備或從一個命令 - 我發現它已經連接到主人。 – timbostop

+0

您可以調試其中的一種'MasterSlaveConnection'方法,通過將斷點放入每個方法來調用。此外,您可能需要在構造函數中放置斷點以檢查連接是否正在初始化。很容易就可以在'app/console'的引導過程中執行這些方法之一。如果連接實際構建且沒有任何方法正在執行,則可能存在配置問題。 – nifr

+0

你有任何提示在應用程序/控制檯中進行調試嗎?我很高興通過網絡界面調試(使用PHPStorm),但不是在控制檯中。 – timbostop

相關問題