2010-04-01 126 views
4

我有一個連接到多個數據庫(Oracle,MySQL和MSSQL)的腳本,每次腳本運行時可能不會使用每個數據庫連接,但所有數據庫連接都可以用於單個腳本執行。我的問題是,「在腳本開始時連接所有數據庫是否更好,即使所有連接都可能不被使用,還是根據需要連接到它們,最好的辦法就是我需要以具有在一個循環中的連接呼叫(以便數據庫連接將新的用於在循環的次數X量)PHP數據庫連接練習

呀示例代碼#1:

// Connections at the beginning of the script 
$dbh_oracle = connect2db(); 
$dbh_mysql = connect2db(); 
$dbh_mssql = connect2db(); 

for ($i=1; $i<=5; $i++) { 
    // NOTE: might not use all the connections 
    $rs = queryDb($query,$dbh_*); // $dbh can be any of the 3 connections 
} 

呀實施例編號#2:

// Connections in the loop 
for ($i=1; $i<=5; $i++) { 
    // NOTE: Would use all the connections but connecting multiple times 
    $dbh_oracle = connect2db(); 
    $dbh_mysql = connect2db(); 
    $dbh_mssql = connect2db(); 

    $rs_oracle = queryDb($query,$dbh_oracle); 
    $rs_mysql = queryDb($query,$dbh_mysql); 
    $rs_mssql = queryDb($query,$dbh_mssql); 
} 

現在我知道你可以使用持續連接,但會那個循環中的每個數據庫都打開一個連接?像mysql_pconnect()mssql_pconnect()adodb for Oracle persistent connection method。我知道持續連接也可以是資源浪費,並且我正在尋找最佳性能/實踐。

這裏是why persistent connections could cause problems

回答

15

使用延遲連接包裝類:

class Connection 
{ 
    private $pdo; 
    private $dsn; 

    public __construct($dsn) 
    { 
     $this->dsn = $dsn; 
    } 

    public query($sql) 
    { 
     //the connection will get established here if it hasn't been already 
     if (is_null($this->pdo)) 
      $this->pdo = new PDO($this->dsn); 

     //use pdo to do a query here 

    } 
} 

我希望你已經使用PDO。如果不是,你應該是。 PDO與數據庫無關。如果您使用過程函數來完成此操作,則必須爲每種數據庫類型創建一個新類。例如,這只是一個骷髏(例如,你想在query()中添加一個$params選項),但是你應該能夠明白這個想法。只有在致電query()時纔會嘗試連接。構建對象不會建立連接。

另外,考慮使用Doctrine。它有着懶惰的聯繫,使得整個生活更加簡單。

+0

我喜歡這種方法,我有一個類似的類,我創建了使用類型(mysql,mssql,oracle)來定義連接/查詢功能的XML配置和通用連接和查詢類。 – 2010-04-01 14:31:58

+1

@Phill如果您使用PDO,甚至不需要這樣做,它可以在不更改代碼的情況下無論連接到哪個數據庫都能正常工作。 – ryeguy 2010-04-01 14:39:26

+0

將不得不檢查PDO,再次thnx – 2010-04-01 14:46:45

2

一個好職位的最佳性能/做法規則很簡單:你只能連接到一個數據庫。

至於連接 - 嘗試實現一些數據庫訪問類。它可以根據需要自動連接。

+1

+1如果您不知道,如果需要特定的連接,請使用僅在使用時才變爲活動狀態的延遲連接。 – selfawaresoup 2010-04-01 13:32:00

+0

懶惰的連接?我從來沒有聽說過這個,你能提供一個好的資源嗎?谷歌搜索以及。謝謝 – 2010-04-01 13:39:41

+0

@Phill:查看我的答案。 – ryeguy 2010-04-01 13:58:17