2011-05-13 212 views
19

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

+0

你能否更新这个以便其他答案被接受?我试图删除我的,因为肯德尔的情况好多了,但不能,因为我接受了。 – 2015-10-16 13:37:48

回答

12

持续连接的问题是可用于MySQL的连接数量是有限的。如果出现问题并且连接未关闭,服务器将长时间保持打开状态。如果服务器的连接耗尽,那么与之相关的每个应用程序都将不可用,直到有人介入。

您可能会经常发现某些问题会出错,并且在错误的情况下,资源过度使用的问题可能会在几个月内泄漏,如果不注意的话,会使您的性能逐渐降低,并且会增加随着时间的推移系统利用率(全部没有收益)。

这是一篇很好的文章,可以帮助你。它专注于MySQL,但大部分相同的想法可以在DBMS的范围内进行概括。

Are PHP persistent connections evil ?

+1

第一个链接已损坏。 – 2015-10-16 13:18:39

44

如果不正确地处理事务时,可以导致一个“新”的持续性已经在一个事务中的连接,这可能会导致混乱。所引起的下列代码

只是一个简单的例子:

<?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(); 

?> 
+19

+1用于证明恐怖 – Charles 2011-05-13 22:01:22

相关问题