每次都应该使用PDO :: ATTR_PERSISTENT吗?

时间:2011-05-13 18:05:59

标签: php pdo

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

2 个答案:

答案 0 :(得分:45)

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

由以下代码引起的一个简单案例:

<?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

BTW正确版本的例子是:

<?php

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

?>

答案 1 :(得分:12)

持久连接的问题是MySQL可用的连接数量有限。如果出现问题且连接未关闭,服务器将长时间保持打开状态。如果服务器的连接用完,那么绑定到它的每个应用程序都将无法使用,直到有人介入。

你可能会不时发现出现问题,在错误的情况下,如果没有注意到资源过度使用的问题可能会泄漏几个月,让你的非常逐渐降级性能和系统利用率随着时间的推移而增加(一切都没有增益)。

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

Are PHP persistent connections evil ?