我工作的一个网站,这是非常MySQL数据库驱动的。 所以,我有事情很多查询。
在这个话题大家都建议在页面的顶部连接到数据库,并在页面的底部断开。
我想知道什么是更有效的,否则一般来说最佳实践: 请每页一个数据库连接,或者只在需要连接? (或者是有没有一般的答案,这取决于?)
此外,我希望找出为什么是这样的最佳实践,从哪个角度看你在看的情况下(如安全性,速度,...我不知道还有什么DB连接可能影响?)
我相信这个问题以前有人问在这里 -但在具体的不是PHP,因此,我没有发现它有帮助。
我现在的做法是连接到每mysqli的数据库为每个我写的功能,并断开在函数的结束,因为它似乎更清洁了我。 这样,如果一个页面不叫这需要DB访问功能,永远不会有打开的连接。 然而,它可能发生,可能有高达每页面加载大约10个连接,这取决于用户确实在网站上的内容。 现在,我想这可能是资源的公平分配。 如果我的理解是正确的存在只能永远是1个DB连接打开。 因此,我认为所有的连接请求都将被排队。 因此,如果用户有多个,长而复杂的查询,该用户就不会托起所有的流量,因为在每个查询之间,其它短的查询可以得到处理。 但是,这只是我做的东西,我不知道它是否真的工作方式...:d
我也知道,很多开发商在这里喜欢用PDO。 我选择使用mysqli的时候我就开始开发,我也没有切换计划。 我希望我的问题可以适用于这两个库。
谢谢 :-)
通常,数据库连接是昂贵创建。 这就是为什么大多数人建议一旦创建连接并重新使用它,直到停止执行,甚至更长的时间,如果数据库客户端库允许它。
作为一个例子,PDO允许创建持久连接,这理应提高性能,因为连接将在连续几个服务请求被重用。 从http://php.net/manual/en/pdo.connections.php :
许多Web应用程序将受益于制作到数据库服务器的持久连接。 持久连接不关闭在脚本的末尾,但缓存,当另一个脚本请求使用相同的凭据连接重新使用。 持久连接的缓存可以让你避免每次脚本需要与数据库对话,导致更快的Web应用程序时建立新连接的开销。
我建议你可以考虑使用一个连接工厂模式。 这将允许你只调用函数的工厂需要它(避免如果从来不需要连接的连接的开销),同时还可以,如果你之前已经建立的连接(避免重复建设开销重用的连接,解构连接)。
也许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说:“打开的连接(以及类似的资源)的脚本执行结束时自动销毁。”
所以,你不必明确关闭连接。 但是,也有可能是时间,其中希望为表现这样做的原因。 这将取决于你所运行的背景下,你将不得不以平衡自己,你看看上下文。
你也可以看看类似的全球或辛格尔顿数据库连接?
注:我没有测试此代码的任何,它意味着是一个可能的工作示例。 ;-)
每页一个数据库连接或每个函数一个数据库连接?
每一个页面
为什么这是最好的做法,
速度和常识
如果我的理解是正确的存在只能永远是1个DB连接打开。
错误。 唯一的限制可以在数据库端进行设置。 而且总有一个游泳池。
让每页一个数据库连接,或者只在需要连接?
是什么阻止你需要的时候连接一次 ,但只? 让你的数据库功能,自动连接,如果没有打开的连接,如果存在重复使用。 虽然我并不觉得值得的混乱,为“非常MySQL数据库驱动的”网站。
文章来源: whats more efficient and why: one db connection per page or one db connection per function? [closed]