最好在没有持久连接的情况下关闭Pdo连接&;Pdo连接性能


Better close Pdo connection on no persistent connection? & Pdo Connection Performance

我更习惯mysql_query命令而不是Pdo命令,但我将在新项目中使用它们。

我想知道,对于非持久性连接,关闭连接是否更好,或者离开连接是否不会产生问题(比如mysql_query)。

第二个问题是:完整的Pdo连接器在性能上存在差异

 $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);

还有无数据库的?

 $dbh = new PDO('mysql:host=localhost', $user, $pass);

我需要一个web应用程序使用多个数据库,我会选择在每个查询上放置dbname.dbtable,而不是在不同的数据库上打开两个或多个连接。

最终还有其他办法吗?

  1. 连接将在脚本结束时自动关闭(或者当$dbh未设置或超出范围时)。这与ext/mysql以及几乎所有其他数据库连接器的情况相同。当你知道你已经完成了连接时,你可以手动关闭连接,以释放可能占用的最小资源,但在实践中,这通常不值得
  2. dbname所做的唯一一件事就是告诉数据库服务器您要使用哪个数据库。唯一的区别是,您不需要每次引用表时都使用db.table.column格式,只需使用table.column,它就能理解您所说的是哪个数据库。没有值得一提的性能差异

如果以后必须执行selectdb()类型的调用,那么无数据库版本实际上效率较低。它必须作为一个单独的查询发送,这比在原始调用中发送开销高得多。

请注意,您不必设置默认DB。您可以将所有查询简单地写为绝对

SELECT fieldname FROM dbname.tablename ...

另外请注意,除非您创建持久连接,否则当脚本退出并开始执行清理操作时,PHP将自动破坏数据库连接。除非您对数据库使用持久连接,不然在脚本退出时,根本不可能保持连接打开。

理论上,持续的联系听起来不错,但它们会带来一大堆问题。例如,你启动了一个事务,做了一堆事情,然后脚本由于某种原因而失效。由于它是用一个持久事务完成的,所以到DB的连接保持打开,事务保持运行,然后一些OTHER php脚本启动,并从池中分配该过时的连接。

现在你遇到了一个问题。原始脚本的事务仍然处于活动状态,并且处于某种不确定的中间状态。新脚本不知道它得到了这个垃圾填充的连接,只会开始自己的操作。因此,您很容易出现死锁、提交错误数据等问题。

一般来说,MySQL中的持久连接应该避免。它的连接协议实际上很轻,开销也很小。使用持久连接池节省的时间远远超过了从以前失败的脚本中获得陈旧/垃圾遍地的连接的危险。

从文档-

成功连接到数据库后,PDO类的实例将返回到脚本中。该连接在该PDO对象的生存期内保持活动状态。要关闭连接,您需要通过确保删除对该对象的所有剩余引用来销毁该对象——您可以通过将NULL分配给包含该对象的变量来实现这一点。如果您没有明确地执行此操作,PHP将在脚本结束时自动关闭连接。

因此,它将在脚本结束时关闭,但我发现在每次查询后关闭PDO连接总是一种很好的做法。