为了澄清一个问题,我们在工作场所使用持久性联系,但并非出于自愿。我们遇到了 真奇怪连接行为,从我们的应用服务器到数据库服务器的初始连接花费了 没错三秒钟,而它应该只花费了几分之一秒的时间。我们认为是内核错误。我们放弃了对它进行故障排除的尝试,因为它是随机发生的,不能按需复制,而且我们的外包 IT 没有具体的能力来跟踪它。
在 MySQL 3.22/3.23的情况下,持久连接被放入 PHP 中,当时 MySQL 并没有那么困难,这意味着您可以很容易地回收连接,没有任何问题。然而,在后来的版本中,问题的数量出现了——是否应该回收带有未提交事务的连接,这会给您带来麻烦。如果使用自定义字符集配置重复使用连接,那么您将再次处于危险之中,而且每个会话变量都可能被转换。
要理解持久连接的关键是你不应该在大多数 web 应用程序中使用它们。它们听起来很诱人,但它们很危险,而且几乎毫无用处。
我确信这上面还有其他线程,但是持久化连接是危险的,因为它在请求之间持久化。例如,如果您在请求期间锁定了一个表,然后无法解锁,那么该表将无限期地保持锁定状态。对于99% 的应用程序来说,持久连接也几乎毫无用处,因为你无法知道不同请求之间是否会使用相同的连接。每个 Web 线程都有自己的一组持久连接,您无法控制哪个线程将处理哪些请求。
PHP 的过程性 mysql 库有一个特性,即随后对 mysql _ connect 的调用将返回相同的链接,而不是打开一个不同的连接(正如人们可能期望的那样)。这与持久连接无关,而是特定于 mysql 库。PDO 没有表现出这种行为