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は新しいデータベース接続を作成しますか、それとも参照を内部的に使用して 1 つの接続のみを保持しますか?

4

1 に答える 1

3

まず、=&PHP 4を使用していない場合、これは不要であり、潜在的に有害です(get_instanceオブジェクトを返すと想定しています)。

新しい接続を作成するかどうかについてcloneは、これはDBの実装によって異なります。私の知る限り、PDOクローン作成時に追加の接続は作成されません。これをテストしたい場合は、start_subquery効果を発揮して実行され、適切な時間スリープする小さなスクリプトを作成します。mysqlに接続して実行します:

SHOW STATUS WHERE `variable_name` = 'Threads_connected'

2(クエリを実行するための接続とスクリプトからの接続)を超える場合は、何らかの理由で追加の接続が確立されています。

DBのクローンを作成する必要があるかどうかについては、なぜクローンを作成するのかわかりませんが、このクラスのユースケースやCIについてはよくわかりません。

于 2012-12-12T19:00:59.737 に答える