【问题标题】:Should PDO::ATTR_PERSISTENT be used every time? [duplicate]每次都应该使用 PDO::ATTR_PERSISTENT 吗? [复制]
【发布时间】:2011-08-25 03:45:16
【问题描述】:

当使用 PDO 建立与数据库的连接时,是否应该每次都使用 PDO 属性 PDO::ATTR_PERSISTENT?它说这会为该用户创建一个持久连接,并且会在您每次请求数据库连接时获取相同的连接,而不是重新建立一个新连接。为什么这不是默认值?有什么理由不用它吗?

【问题讨论】:

  • 你能更新这个以便接受另一个答案吗?我试图删除我的,因为 Kendall 的要好得多,但不能因为我的被接受了。

标签: php pdo


【解决方案1】:

如果您没有正确处理事务,可能会导致事务中已经存在“新”持久连接,从而导致混乱。

以下代码导致的一个简单案例:

<?php

$pdo = getCustomPersistantPDO();
$pdo->beginTransaction();
if( rand() % 2 === 0 ) {
    //simulate a poorly handled error
    exit();
}
$pdo->commit();

?>

请求 1:

(starts w/o a transaction open)
openTransaction
incorrectly handled error
(never closes transaction)

请求 2:

(start w/ a transaction open, because it was not closed in the previous connection.)
openTransaction -> fails due to already open

顺便说一句,示例的正确版本是:

<?php

$pdo = getCustomPersistantPDO();
$pdo->beginTransaction();
if( rand() % 2 === 0 ) {
    //simulate a correctly handled error
    $pdo->rollBack();
    exit();
}
$pdo->commit();

?>

【讨论】:

  • +1 用于展示恐怖
【解决方案2】:

持久连接的问题在于 MySQL 可用的连接数量是有限的。如果出现问题并且该连接未关闭,则服务器将使其长时间保持打开状态。如果服务器的连接用完了,那么与之相关的每个应用程序都将不可用,直到有人干预。

您可能会不时预料到某些事情会出现问题,并且在错误的情况下,如果没有注意到资源过度使用的问题可能会持续数月,从而使您非常逐渐降级随着时间的推移,性能和系统利用率的提高(所有这些都是徒劳的)。

这是一篇可以帮助您的好文章。它侧重于 MySQL,但大多数相同的想法可以推广到 DBMS 的范围内。

Are PHP persistent connections evil ?

【讨论】:

  • 第一个链接坏了。
猜你喜欢
  • 1970-01-01
  • 2019-08-15
  • 2016-07-06
  • 2017-10-13
  • 1970-01-01
  • 2014-12-10
  • 2020-07-24
  • 1970-01-01
  • 2014-06-19
相关资源
最近更新 更多