4

我正在开发 CodeIgniter 的子查询库(链接到项目),它通过返回您可以使用的数据库对象而不是普通$this->db对象来工作。

最初,我每次都在创建新的数据库对象:

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

但后来我意识到(或者更确切地说有人向我指出)这每次都会建立一个新的数据库连接!所以我决定尝试clone对象而不是制造新对象。

我将代码更新为如下所示(链接到完整代码):

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;
    }
}

我对此进行了测试,它似乎有效,但我不确定这是否能解决问题。usingclone是建立一个新的数据库连接,还是在内部使用引用并且只保留一个连接?

4

1 回答 1

3

首先,=&如果您不使用 PHP 4(我假设get_instance返回一个对象),这是不必要的并且可能有害。

至于是否clone创建新连接..这取决于数据库实现。据我所知,PDO克隆时不会创建额外的连接。如果您想对此进行测试,请创建一个小脚本,该脚本运行start_subquery到某种效果,然后休眠相当长的时间。连接到mysql并运行:

SHOW STATUS WHERE `variable_name` = 'Threads_connected'

如果它超过 2 个(运行查询的连接和来自脚本的连接),那么由于某种原因正在建立一个额外的连接。

至于你是否应该克隆数据库,我不知道你为什么要这样做,但我真的不知道这个类的用例,我对 CI 也不太了解。

于 2012-12-12T19:00:59.737 回答