2011-08-20 27 views
10

Io uso doctrine 2 PDO con mysql.Doctrine 2 Close Connection

Durante lo stress test del server, mysql segnala molte connessioni interrotte (fino al 20%).

Sto cercando di individuare il problema.

Il manuale di MySQL suggerisce di assicurare che le connessioni al database siano chiuse correttamente. http://dev.mysql.com/doc/refman/5.0/en/communication-errors.html

Non riesco a trovare alcuna informazione se la dottrina chiude effettivamente le connessioni o no, o utilizza connessioni persistenti.

Inoltre, c'è qualcos'altro che può rendere conto di connessioni interrotte? Sono a perdita qui.

PS. Il server è ubuntu 10.04, nginx 1.x, php 5.3.5 (fpm) e mysql 5.1.41

+0

Doctrine2 raccomanda di utilizzare APC o altri meccanismi di memorizzazione nella cache. Non riuscendo a fornire uno potrebbe causare molte connessioni. Hai qualche? – J0HN

+1

Cache per le connessioni? – iBiryukov

+0

Ho cache APC per metadati e query. Hai un link al manuale dove descrivono come mettere in cache le connessioni? – iBiryukov

risposta

21

Da quello che ho osservato, Doctrine usa connessioni persistenti.

Ci siamo imbattuti in un problema, lanciando test unitari in symfony2, dove il database è stato spammato con connessioni nello stato "Sleep". La soluzione che ha funzionato per noi:

$entityManager->getConnection()->close(); 
+1

Puoi dirmi quando chiami da vicino? Cerchiamo di eseguirlo negli eventi kernel.terminate o kernel.response ma le connessioni sono ancora in sospeso in mysql. – Vail

+1

Lo stavo usando nei test unitari quindi era nel metodo tearDown. Scusa, non posso aiutarti molto. – wdev

+0

Continuo a vedere crescere l'elenco delle connessioni aperte.: -/ – sensorario

1

Ho lo stesso problema e

$entityManager->getConnection()->close(); 

sembra funzionare, ma funziona 'meglio' in alcune versioni di PHP se si aggiunge

gc_collect_cycles() 

dopo aver chiuso le connessioni. Sto ancora avendo quel tipo di problemi nella versione php più vecchia, potrebbe essere qualcosa in relazione con il garbage collector credo. Vi terremo aggiornati se trovo una soluzione finale per tutte le versioni di PHP

+0

Nel mio caso gc_collect_cycles() ha risolto il mio errore "troppe connessioni" durante l'esecuzione dei test PHPUnit – Davincho