我正在为CodeIgniter(link to project)创建子查询库,它通过返回可以使用的数据库对象而不是普通的$this->db
对象来工作。
最初,我每次都在制作新的数据库对象:
$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
建立新的数据库连接,还是在内部使用引用并且只保留一个连接?
答案 0 :(得分:3)
首先,=&
是不必要的,如果您不使用PHP 4(我假设get_instance
返回一个对象)可能有害。
至于clone
是否创建新连接..这取决于数据库实现。据我所知,PDO
在克隆时不会创建额外的连接。如果要对此进行测试,请创建一个运行start_subquery
的小脚本,然后休眠一段时间。连接到mysql并运行:
SHOW STATUS WHERE `variable_name` = 'Threads_connected'
如果它超过2(您运行查询的连接和脚本中的连接),则由于某种原因正在建立另一个连接。
至于是否你应该克隆数据库,我不知道你为什么要这样做,但我真的不知道这个类的用例,我也不太了解CI