6

私は非常にMySQLDB駆動のWebサイトで作業しています。だから私はたくさんの質問をしている。

このトピックでは、ページの上部でDBに接続し、ページの下部で切断することをお勧めします。

より効率的な、または一般的に言えばベストプラクティスは何か疑問に思っています。ページごとに単一のデータベース接続を作成しますか、それとも必要な場合にのみ接続しますか?(または、一般的な答えはありません、そしてそれは異なりますか?)

さらに、なぜこのベストプラクティスであるのか、どの観点からシナリオを見ているのかを調べています(たとえば、セキュリティ、速度、... DB接続が他に何に影響するかわかりませんか?!)

この質問は以前にここで尋ねられたと思いますが、特にPHPについてはそうではないため、役に立たなかったと思います。

私の現在の慣習は、mysqliごとにDBに接続することです。関数ごとに作成し、関数の最後で切断します。これは、私にはわかりやすいように思えたためです。このように、ページがDBアクセスを必要とする関数を呼び出さない場合、接続が開かれることはありません。ただし、ユーザーがサイトで何をするかによっては、ページの読み込みごとに最大約10の接続が発生する場合があります。今、私はこれが資源の公平な分配であるかもしれないと思いました。私が正しく理解していれば、常に1つのDB接続しか開くことができません。したがって、すべての接続要求がキューに入れられると思います。したがって、ユーザーが複数の長く複雑なクエリを持っている場合、各クエリの間に他の短いクエリが処理される可能性があるため、このユーザーはすべてのトラフィックを保持することはありません。しかし、それは私が物を作っているだけです、それが本当にそのように機能するかどうかはわかりません...:D

また、このあたりの多くの開発者がPDOを使用することを好むことも知っています。開発を始めたときにmysqliを使用することを選択しましたが、切り替える予定はありません。私の質問が両方の図書館に当てはまるといいのですが。

ありがとう :-)

4

3 に答える 3

8

通常、データベース接続の作成にはコストがかかります。これが、ほとんどの人が接続を一度作成し、実行が停止するまで、またはデータベースクライアントライブラリで許可されている場合はさらに長く再利用することを推奨する理由です。

例として、PDOは永続的な接続の作成を許可します。これは、接続が連続して複数の要求を処理するために再利用されるため、おそらくパフォーマンスを向上させます。http://php.net/manual/en/pdo.connections.phpから:

多くのWebアプリケーションは、データベースサーバーへの永続的な接続を確立することで恩恵を受けます。持続的接続は、スクリプトの最後では閉じられませんが、別のスクリプトが同じ資格情報を使用して接続を要求すると、キャッシュされて再利用されます。持続的接続キャッシュを使用すると、スクリプトがデータベースと通信する必要があるたびに新しい接続を確立するオーバーヘッドを回避できるため、Webアプリケーションが高速になります。

于 2013-03-25T18:29:10.403 に答える
5

接続ファクトリパターンの使用を検討することをお勧めします。これにより、ファクトリを必要とする関数でのみファクトリを呼び出すことができ(接続が不要な場合は接続のオーバーヘッドを回避)、以前に接続を確立したことがある場合は接続を再利用できます(繰り返し構築および接続の分解)。

おそらく、あなたのページに含まれている、またはこのようなヤーローダーを介して利用可能なconnectionFactory.php。

class ConnectionFactory{

private static $factory;
public static function getFactory(){
    if (!self::$factory){
        self::$factory = new ConnectionFactory();
        $this->db = null;
    }
    return self::$factory;
}

private $db;

public function getConnection(){
    if (is_null($this->db))
        $this->db = new mysqli('localhost', 'my_user', 'my_password', 'my_db');
        if ($this->db->connect_error){
            throw new Exception("Connect Error ("
                . $this->db->connect_errno
                . ") "
                . $this->db->connect_error
        );
    }
    return $this->db;
}

public function closeConnection(){
   if (! is_null($this->db)){
       $this->db::close();
       $this->db = null;
   }
}

}

その後、関数で後で使用できます。

function doStuff(){
try{
    $conn = ConnectionFactory::getFactory()->getConnection();
}catch (Exception $e){

}

}

これにより、接続をまったく使用しない場合でもオーバーヘッドが発生することはなく、使用する場合は接続を活用できます。

devzone.zend.comによると、「開いている接続(および同様のリソース)は、スクリプトの実行が終了すると自動的に破棄されます。」

したがって、接続を明示的に閉じる必要はありません。ただし、パフォーマンス上の理由から、そうすることが望ましい場合もあります。これは、実行しているコンテキストに依存するため、コンテキストを確認するときに、自分でバランスを取る必要があります。

また、データベース接続用の同様のグローバルまたはシングルトンを見るかもしれませんか?

注:このコードはテストしていません。これは、おそらく実用的な例となることを目的としています。;-)

于 2013-03-25T18:50:21.743 に答える
2

ページごとに1つのdb接続または機能ごとに1つのdb接続?

1ページに1つ

なぜこのベストプラクティスなのか、

スピードと常識

私が正しく理解していれば、常に1つのDB接続しか開くことができません。

間違い。唯一の制限はDB側で設定できます。そして、常にプールがあります。

ページごとに単一のdb接続を作成しますか、それとも必要な場合にのみ接続しますか?

一度だけ接続するのを妨げるのは、必要なときだけですか?開いている接続がない場合はdb関数を自動接続し、存在する場合は再利用します。「非常にMySQLDB駆動型」のサイトを台無しにする価値はありませんが。

于 2013-03-25T18:31:18.497 に答える