2011-05-13 4 views
19

PDO를 사용하여 데이터베이스에 연결할 때마다 PDO 속성 PDO :: ATTR_PERSISTENT를 매번 사용해야합니까? 이는 사용자에게 지속적인 연결을 생성하고 데이터베이스 연결을 요청할 때마다 새 연결을 다시 설정하는 대신 동일한 연결을 사용하게됩니다. 이것이 기본값이 아닌 이유는 무엇입니까? 그것을 사용하지 않을 이유가 있습니까?매번 PDO :: ATTR_PERSISTENT를 사용해야합니까?

+0

다른 답변을 수락하도록 업데이트 할 수 있습니까? 나는 Kendall 's가 훨씬 좋기 때문에 나는 나의 것을 삭제하려고 노력했다. 그러나 나의 것이 받아 들일 수 없기 때문에 나는 그것을 삭제할 수 없다. –

답변

12

영구 연결 문제는 MySQL에서 사용할 수있는 연결 수가 제한된다는 것입니다. 무언가 잘못되어 연결이 닫히지 않으면 서버는 오랫동안 열어 두어야합니다. 서버의 연결이 끊어지면 다른 사람이 개입 할 때까지 연결된 모든 응용 프로그램을 사용할 수 없게됩니다.

당신은 아마 성능과 증가에 매우 점진적 디그레이 당신을 떠나,주의하지 않으면 개월로 누출 수있는 일이 수시로 잘못 기대 이상 - 사용 자원의 잘못된 상황에서 문제가 있습니다 시간이 지남에 따라 시스템 활용도가 향상됩니다 (모두 이득이 없음).

다음은 유용한 도움말 중 하나입니다. 그것은 MySQL에 초점을 맞추지 만, 대부분의 동일한 생각은 DBMS의 스펙트럼 전반에 걸쳐 일반화 될 수 있습니다. 제대로 트랜잭션을 처리하지 않는 경우

Are PHP persistent connections evil ?

+1

첫 번째 링크가 끊어졌습니다. –

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