什么更有效,为什么:每页一个数据库连接或每个函数一个数据库连接? [关闭](whats more

2019-07-23 07:47发布

我工作的一个网站,这是非常MySQL数据库驱动的。 所以,我有事情很多查询。

在这个话题大家都建议在页面的顶部连接到数据库,并在页面的底部断开。

我想知道什么是更有效的,否则一般来说最佳实践: 请每页一个数据库连接,或者只在需要连接? (或者是有没有一般的答案,这取决于?)

此外,我希望找出为什么是这样的最佳实践,从哪个角度看你在看的情况下(如安全性,速度,...我不知道还有什么DB连接可能影响?)

我相信这个问题以前有人问在这里 -但在具体的不是PHP,因此,我没有发现它有帮助。

我现在的做法是连接到每mysqli的数据库为每个我写的功能,并断开在函数的结束,因为它似乎更清洁了我。 这样,如果一个页面不叫这需要DB访问功能,永远不会有打开的连接。 然而,它可能发生,可能有高达每页面加载大约10个连接,这取决于用户确实在网站上的内容。 现在,我想这可能是资源的公平分配。 如果我的理解是正确的存在只能永远是1个DB连接打开。 因此,我认为所有的连接请求都将被排队。 因此,如果用户有多个,长而复杂的查询,该用户就不会托起所有的流量,因为在每个查询之间,其它短的查询可以得到处理。 但是,这只是我做的东西,我不知道它是否真的工作方式...:d

我也知道,很多开发商在这里喜欢用PDO。 我选择使用mysqli的时候我就开始开发,我也没有切换计划。 我希望我的问题可以适用于这两个库。

谢谢 :-)

Answer 1:

通常,数据库连接是昂贵创建。 这就是为什么大多数人建议一旦创建连接并重新使用它,直到停止执行,甚至更长的时间,如果数据库客户端库允许它。

作为一个例子,PDO允许创建持久连接,这理应提高性能,因为连接将在连续几个服务请求被重用。 从http://php.net/manual/en/pdo.connections.php :

许多Web应用程序将受益于制作到数据库服务器的持久连接。 持久连接不关闭在脚本的末尾,但缓存,当另一个脚本请求使用相同的凭据连接重新使用。 持久连接的缓存可以让你避免每次脚本需要与数据库对话,导致更快的Web应用程序时建立新连接的开销。



Answer 2:

我建议你可以考虑使用一个连接工厂模式。 这将允许你只调用函数的工厂需要它(避免如果从来不需要连接的连接的开销),同时还可以,如果你之前已经建立的连接(避免重复建设开销重用的连接,解构连接)。

也许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说:“打开的连接(以及类似的资源)的脚本执行结束时自动销毁。”

所以,你不必明确关闭连接。 但是,也有可能是时间,其中希望为表现这样做的原因。 这将取决于你所运行的背景下,你将不得不以平衡自己,你看看上下文。

你也可以看看类似的全球或辛格尔顿数据库连接?

注:我没有测试此代码的任何,它意味着是一个可能的工作示例。 ;-)



Answer 3:

每页一个数据库连接或每个函数一个数据库连接?

每一个页面

为什么这是最好的做法,

速度和常识

如果我的理解是正确的存在只能永远是1个DB连接打开。

错误。 唯一的限制可以在数据库端进行设置。 而且总有一个游泳池。

让每页一个数据库连接,或者只在需要连接?

是什么阻止你需要的时候连接一次 ,但只? 让你的数据库功能,自动连接,如果没有打开的连接,如果存在重复使用。 虽然我并不觉得值得的混乱,为“非常MySQL数据库驱动的”网站。



文章来源: whats more efficient and why: one db connection per page or one db connection per function? [closed]