0

我是否在基類中調用了我繼承的抽象類?什麼時候在MVC(PHP)中創建我的數據庫連接?

class ConcreteClass extends MyAbstractClass(){ 
    public function __construct(){ 
    parent::__construct(); //or other method that returns my adapter, PDO in this case. 
    } 
} 

或者,我得到創建的每個對象引用新的適配器:

class ConcreteClass extends BaseClass(){ //or no class extension for that matter 
    public function __construct(){ 
    public function __construct(DB $adapter) { //or call DB on another class for DI via set/get 
     $this->adapter = $adapter; 
     $this->adapter->connect(); 
    } 
    } 
} 

我將創建與創建的每個對象到數據庫的新連接。這不好嗎?我不知道另一種辦法,除了一個單身人士,我不想使用它。

http請求 - >控制器 - >最終我得到我的對象,這會在每次創建對象時調用數據庫,新的連接。

我已經創建了一個類型爲「DB」的接口或抽象類,因此如果需要,我可以更改我的數據源,儘管我已經使用了PDO。

+1

這應該有助於http://stackoverflow.com/a/11369679/727208 ..簡短的回答:*首次初始化數據映射器,然後爲每個其他實例化的數據映射器重新使用相同的數據庫連接*。 – 2014-09-04 14:49:54

回答

0

您可以查看Laravel框架如何解決這個問題 - 請參閱https://github.com/illuminate/database/blob/master/DatabaseManager.php。此DatabaseManager對象的AFAIK單個實例存儲在Laravel ioc容器中。

我將創建與每個對象創建新的數據庫連接是這個壞?」 - 這取決於:

  1. 當連接到遠程計算機,從而爲每個對象新的連接可以是時間/資源消耗,尤其是當您有很多對象時
  2. 您也可能會遇到某種最大連接限制,特別是當嵌套類使用單獨的連接時(這是對存儲連接的對象的refcount不會在0之前命中腳本執行結束)。
  3. AFAIK與事務相關的所有事務只能在單個連接上運行,所以當你使用單獨的連接時,可以說在你的持久層中,沒有辦法在服務層使用事務邏輯。

和恕我直言,如果你需要換出PHP中的數據源,你已經擰了。 PDO最好是PHP所提供的,並且它對此不太好 - 它只爲您提供持久的PHP API,您仍然需要手動轉換所有供應商特定的SQL。

+0

那麼Laravel使用單例概念?受保護的函數createSingleConnection。 – johnny 2014-09-02 17:27:46

+1

@johnny我對設計模式術語的瞭解不如應有,但Laravel的默認行爲是在需要時創建連接,然後繼續使用此連接而不是創建新連接(所以是的,基本上是單例)。連接保存在「字符串」 - >「連接」映射中,以便您可以同時連接到不同的數據庫。連接管理器本身通過Lavarel容器進行訪問。 – Mikk 2014-09-02 17:42:58

相關問題