2012-12-12 71 views
4

我正在研究CodeIgniter的子查詢庫(link to project),它通過返回可以使用的數據庫對象而不是正常的$this->db對象來工作。克隆CodeIgniter的數據庫對象

本來,我是在製造新的數據庫每次對象:

$this->CI =& get_instance(); 
$db = $this->CI->load->database('', true); 

但後來我意識到(或者更確切地說,有人向我指出的),這將使每一次新的數據庫連接!所以我決定嘗試clone而不是製作新的物體。

我更新的代碼看起來像這樣(link to full code):

class Subquery{ 
    var $CI, $db; 

    function __construct(){ 
     $this->CI =& get_instance(); 
     $this->db = $this->CI->db; // Default database connection 
    } 

    function start_subquery(){ 
     $newDatabase = clone $this->db; 
     // some more code 
     return $newDatabase; 
    } 
} 

我進行了測試,它似乎工作,但我不知道這是否解決了問題。使用clone是否會建立新的數據庫連接,還是在內部使用引用並僅保留一個連接?

+1

除非'__clone()'在' - > db'中實現,否則它將使用相同的db連接資源afaik。通過設置和檢索某些用戶定義的變量(不打算下載CI來測試:P),可以輕鬆進行測試 – Wrikken

+1

@Wrikken:酷!我看過,它似乎沒有'__clone'方法。那很好。我只想要一個連接:-) –

回答

3

首先,=&是不必要的,如果您不使用PHP 4(我假設get_instance返回一個對象)可能有害。

至於clone是否創建一個新的連接..這取決於數據庫的實施。據我所知,PDO克隆時不會創建額外的連接。如果你想測試這個,創建一個小腳本,運行start_subquery來達到一定的效果,然後睡眠一段相當長的時間。連接到MySQL並運行:

SHOW STATUS WHERE `variable_name` = 'Threads_connected' 

如果是大於2(您連接到運行查詢和腳本中的一個),那麼額外的連接正在出於某種原因做。

至於是否你應該克隆數據庫,我不知道你爲什麼想這樣做,但我並不真正瞭解這個類的用例,也不太瞭解CI。

+1

請注意,在我的生產數據庫中,連接的線程很容易進入數百個......如果您只能保證您是當時唯一使用數據庫的人, 。對於MySQL,在克隆之前有一個'SET @var ='test';'和克隆之後的'SELECT @var;'更安全(如果是'test',則使用相同的連接)。 – Wrikken

+2

@Wrikken true,我假設他會對自己的mysql實例而不是生產服務器運行它 –

+0

@Wrikken:我可以在我的本地盒子上測試'SHOW STATUS',那裏不會有數百個連接: - P = –