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

dqh*_*cks 20 php pdo

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

Ken*_*ins 45

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

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

<?php

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

?>
Run Code Online (Sandbox Code Playgroud)

要求1:

(starts w/o a transaction open)
openTransaction
incorrectly handled error
(never closes transaction)
Run Code Online (Sandbox Code Playgroud)

要求2:

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

BTW正确版本的例子是:

<?php

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

?>
Run Code Online (Sandbox Code Playgroud)

  • +1表示恐怖 (19认同)

Jef*_*ert 12

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

你或许可以期待的东西出问题不时,并根据错误的情况下资源的问题,过度使用会渗透到几个月,如果没有注意到,留给你一个非常性能和随着时间的增加逐渐降解系统利用率(一切都没有收获).

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

PHP持久连接是邪恶的吗?

  • 第一个链接坏了。 (2认同)