2011-09-14 47 views
1

我現在做這樣一個Oracle連接:使從PHP不化妝重複連接一個Oracle數據庫連接

$c = oci_connect('username', 'password', 'host'); 

,我用我的OCI8查詢,像這樣:

$s = oci_parse($this->c, $query); 
oci_execute($s); 

然而,每一次我想查詢,我創建了一個新的連接,即我多次做$c = ...。這是一件愚蠢的事情。在程序中的任何位置創建單個Oracle連接並使用該連接的正確或最佳方式是什麼?我可以讓全局變量爲$c,但全局變量不好。

非常感謝:)。

+0

*「全局變量不好」*爲什麼? – NullUserException

+0

我不想開始全局變量辯論!他們可以從任何地方改變(因爲他們是全球性的),所以有時很難弄清楚他們在哪裏被改變。快速谷歌搜索揭示了這一點:http://c2.com/cgi/wiki?GlobalVariablesAreBad – ale

+0

我無意開始辯論。我只是把它拋出去,因爲很多人都有先入爲主的想法,比如'X壞',而沒有真正理解*爲什麼*這很糟糕。實際上,你可以做什麼或不可以做什麼取決於你的代碼是怎樣的。有時全局變量可能是* only *選項。 – NullUserException

回答

0

你不能用一個靜態變量,像這樣...

class DbHandler { 
    private static $_mOciHandle; 

    private function __construct() {} 

    GetHandle ($u, $p, $dsn, $charset) { 
     if (!isset(self::$_mOciHandle)) 
      self::$_mOciHandle = oci_connect ($u, $p, $dsn, $charset); 
     return self::$_mOciHandle; 
     } 
} 

它仍然呈現你的數據庫手柄(間接)全球性的,但你永遠只能有一個連接,這樣一來它的保護「意外」更新。

1

也許你應該使用oci_pconnect,因爲它會創建一個持久連接。 php manual oci_pconnect

另一種方法是使用單例模式,由於你不能單元測試它,所以不鼓勵使用單例模式。