什么更有效,为什么:每页一个数据库连接或每个功能一个数据库连接?

时间:2013-03-25 18:15:47

标签: php mysql performance mysqli

我正在开发一个非常MySQL数据库驱动的网站。所以我有很多疑问。

this topic中,每个人都建议连接到页面顶部的数据库,并在页面底部断开连接。

我想知道什么是更有效率,或者一般来说最佳做法:每页建立一个数据库连接,或者只根据需要连接?(或者没有一般性答案,这取决于哪些?)

此外,我希望找出为什么这是最佳做法,从哪个角度看你的情景(例如安全性,速度,......我不知道还有什么数据库连接可能会影响?!)

我相信在here之前已经问过这个问题 - 但不是特定于PHP的问题,因此我觉得它没有用。

我目前的做法是为我编写的每个函数连接到每个 mysqli 的数据库,并在函数结束时断开连接,因为它对我来说似乎更清晰。这样,如果页面没有调用需要DB访问的功能,则永远不会打开连接。但是,可能会发生每页加载最多大约10个连接,具体取决于用户在网站上执行的操作。现在我认为这可能是公平的资源分配。如果我理解正确,则只能打开1个DB连接。因此,我假设所有连接请求都将排队。因此,如果用户具有多个,长且复杂的查询,则该用户将不会占用所有流量,因为在每个查询之间,可以处理其他短查询。但那只是我制作东西,我不知道它是否真的会那样......:D

此外,我知道这里的很多开发人员都喜欢使用 PDO 。我开始开发时选择使用 mysqli ,我没有切换的计划。我希望我的问题可以适用于两个图书馆。

谢谢: - )

3 个答案:

答案 0 :(得分:7)

通常,数据库连接的创建成本很高。这就是为什么大多数人建议创建连接一次并重新使用它直到执行停止,或者如果数据库客户端库允许则更长时间。

作为示例,PDO允许创建持久连接,这可以提高性能,因为连接将被重用于连续提供多个请求。来自http://php.net/manual/en/pdo.connections.php

  

许多Web应用程序将从与数据库服务器的持久连接中受益。持久连接不会在脚本末尾关闭,而是在另一个脚本使用相同凭据请求连接时进行高速缓存和重新使用。持久连接缓存允许您避免每次脚本需要与数据库通信时建立新连接的开销,从而产生更快的Web应用程序。

答案 1 :(得分:4)

我建议您考虑使用连接工厂模式。这将允许您只在需要它的函数中调用工厂(如果从不需要连接,则避免连接的开销),同时允许您重新连接,如果您之前已建立连接(避免重复构建和连接的开销)解构连接)。

也许你的网页中包含了connectionFactory.php,或者像这样通过yer loader提供。

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说:“在脚本执行结束时会自动销毁开放式连接(和类似资源)。”

因此您不必显式关闭连接。但是,出于性能原因,有时可能需要这样做。这将取决于您正在运行的上下文,并且您必须在查看上下文时自己平衡。

您也可以查看类似的Global or Singleton for database connection?

注意:我没有测试过这些代码,它可能是一个可行的例子。 ; - )

答案 2 :(得分:1)

  

每页一个数据库连接或每个功能一个数据库连接?

每页一个

  

为什么这是最佳做法,

速度和常识

  

如果我理解正确,则只能打开1个DB连接。

错误。唯一的限制可以在DB侧设置。而且总有一个游泳池。

  

每页建立一个数据库连接,还是只根据需要连接?

是什么阻止您连接一次,但只有需要?如果没有打开的连接,则使db函数自动连接,如果存在则重用它。虽然我发现“非常MySQL数据库驱动”的网站并不值得一塌糊涂。