是否应每次都使用 PDO::ATTR_PERSISTENT?

2022-08-30 18:51:49

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


答案 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();

?>

答案 2

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

您可能会不时地遇到一些问题,并且在错误的情况下,如果不注意,资源过度使用的问题可能会泄漏数月,从而使您的性能逐渐下降,并随着时间的推移提高系统利用率(所有这些都没有好处)。

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

PHP 持久连接是邪恶的吗?


推荐