【发布时间】:2011-08-25 03:45:16
【问题描述】:
当使用 PDO 建立与数据库的连接时,是否应该每次都使用 PDO 属性 PDO::ATTR_PERSISTENT?它说这会为该用户创建一个持久连接,并且会在您每次请求数据库连接时获取相同的连接,而不是重新建立一个新连接。为什么这不是默认值?有什么理由不用它吗?
【问题讨论】:
-
你能更新这个以便接受另一个答案吗?我试图删除我的,因为 Kendall 的要好得多,但不能因为我的被接受了。
当使用 PDO 建立与数据库的连接时,是否应该每次都使用 PDO 属性 PDO::ATTR_PERSISTENT?它说这会为该用户创建一个持久连接,并且会在您每次请求数据库连接时获取相同的连接,而不是重新建立一个新连接。为什么这不是默认值?有什么理由不用它吗?
【问题讨论】:
如果您没有正确处理事务,可能会导致事务中已经存在“新”持久连接,从而导致混乱。
以下代码导致的一个简单案例:
<?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();
?>
【讨论】:
持久连接的问题在于 MySQL 可用的连接数量是有限的。如果出现问题并且该连接未关闭,则服务器将使其长时间保持打开状态。如果服务器的连接用完了,那么与之相关的每个应用程序都将不可用,直到有人干预。
您可能会不时预料到某些事情会出现问题,并且在错误的情况下,如果没有注意到资源过度使用的问题可能会持续数月,从而使您非常逐渐降级随着时间的推移,性能和系统利用率的提高(所有这些都是徒劳的)。
这是一篇可以帮助您的好文章。它侧重于 MySQL,但大多数相同的想法可以推广到 DBMS 的范围内。
【讨论】: