2014-02-28 63 views
5

我在Laravel 4.1中有一個關於處理多個數據庫連接的問題。 說我有一個DB主機與主機Laravel 4和MySQL的連接太多

如3個DBS:

'mysql' => array(
     'driver' => 'mysql', 
     'host'  => 'localhost', 
     'database' => 'DB_1', 
     'username' => $_ENV['MYSQL_USER'], 
     'password' => $_ENV['MYSQL_PASS'], 
     'charset' => 'utf8', 
     'collation' => 'utf8_unicode_ci', 
     'prefix' => '', 
    ), 

    'mysql2' => array(
     'driver' => 'mysql', 
     'host'  => 'localhost', 
     'database' => 'DB_2', 
     'username' => $_ENV['MYSQL_USER'], 
     'password' => $_ENV['MYSQL_PASS'], 
     'charset' => 'utf8', 
     'collation' => 'utf8_unicode_ci', 
     'prefix' => '', 
    ), 

    'mysql3' => array(
     'driver' => 'mysql', 
     'host'  => 'localhost', 
     'database' => 'DB_3', 
     'username' => $_ENV['MYSQL_USER'], 
     'password' => $_ENV['MYSQL_PASS'], 
     'charset' => 'utf8', 
     'collation' => 'utf8_unicode_ci', 
     'prefix' => '', 
    ), 

我應該做的那些數據塊3個不同的連接?

或者我應該只是有一個連接,並在每個模型指定表名 喜歡的東西:

public $table = "DB_2.table_name"; 

我之所以這樣問,是,我已經注意到,我更容易耗盡 數據庫連接,因爲它創建一個新的數據庫連接,當它需要連接到不同的數據庫時,它需要 。

我知道兩者都有效,但我對這種情況下被認爲是「最佳實踐」的事情感興趣。

在此先感謝您的反饋意見。

乾杯。

回答

1

指定到表中,而不是數據庫實現。

我不是那種允許跨DB在同一臺服務器上的數據庫之間查詢MySQL的'功能'的忠實粉絲。這是什麼可以讓你提到的東西。

  • 如果您更改了數據庫的名稱,則需要在代碼中重構表名。
  • 如果您創建一個測試數據庫像table_name_test對代碼進行測試或DB修改,你必須修改所有的表在你的代碼每次分貝的對比之間跳轉只需要編輯配置文件時間馴服。
  • 如果你移動到一個不同的充DB技術,無需數據庫名稱(每個服務器/ fuile一個DB,你需要重構每班你的表名屬性)
  • 它導致暗下來,誘人又卑鄙的路徑的交叉db查詢如select * from db1.foo f Join db2.bar b on b.id = f.id;。恭喜你,只是將你的2個數據庫變成了一個可能無法在MySQL之外運行的大型數據庫

此外,即使您指定了三個連接,您可能也沒有建立連接並一次使用全部三個連接。 .. 我希望。如果你確實使用全部3個連接,每個請求給你laravel app/site保存2個連接可能是微型優化。

+0

是的,我認爲你是絕對正確的。最終,我們需要重新設計我們的數據模型,以便我們不必爲一個工作流程創建多個數據庫連接 - 尤其是在單個查詢的情況下。 在那之前,我需要做一些讓系統免於重載的東西。我遇到的問題是我們有很多併發請求正在處理中。這會導致每個請求最多有3個連接 - 這可能會降低高流量的性能。 – Gimli

+0

@Gimli PDO中沒有辦法(假設你在laravel中使用它)在相同的連接上「切換」數據庫。一旦將dsn傳遞給構造函數,它就會被設置。 DSN應該有指定的數據庫。如果您嘗試在$表中使用db名稱,則可能會看到如下所示的請求:'select * from DB1.DB2.footable'。 – Ray

+0

@Gimili當然,如果您不使用orm或DQL,則可以使用手動構建的查詢來執行此操作。 – Ray

0

當我需要的時候,這段代碼爲我製造了訣竅。

Config::set('database.default', 'database_name'); 

在你的情況,你可能需要的那些取代數據庫名稱。每當我看到需要切換時,我都會在控制器中調用它。在查詢之前,例如。

我不知道,如果是以往任何時候都做的最好的方式,但它的工作對我來說,我認爲這值得分享! = d

+1

雖然這可能會起作用,但我不確定在控制器中建立數據庫連接是不錯的做法。但是,我不太確定即時打開和關閉連接是最高性能的事情。特別是如果需要查詢多個數據庫。然後在最糟糕的情況下,您仍然需要3個獨立的數據庫連接。 – Gimli