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