In un sito che stavamo sviluppando improvvisamente in produzione inizia ad
apparire questo errore
Timeout expired. The timeout period elapsed
prior to obtaining a connection from the pool
Questo errore viene
generato quando ci si dimentica di chiudere le sessioni o di effettuare il
dispose su un oggetto session o su uno degli oggetti ADO.NET che supporta
l'interfaccia IDisposable. Questo problema si chiama connection leak perchè la
connessione non viene mai tornata al pool di connessioni che piano piano si
esaurisce.
Come individuarlo
Il modo più rapido è utilizzare il
perfmon.exe che ha al suo interno appositi contatori dedicati al monitoraggio,
li trovate sotto le categorie .NET data provider for SqlServer o .NET
CLR DATA. In questo modo potete navigare nel vostro sito e vedere in
quale pagina si genera il problema. Si può infatti semplicemente cercare
per pagine o operazioni che aumentano il numero di connessioni nel pool, ma
il contatore più utile è senza dubbio il
NumberOfReclaimedConnections, che indica quante volte una
connessione è stata liberata forzatamente dal garbage collector. Un valore
diverso da zero per questo contatore rivela sicuramente che ci sono dei
leak nel codice. Per conoscere comunque tutti i contratori
disponibili, consultare questo riferimento.
Per evitare questo problema è sempre bene fare i test di carico dei
propri siti, questo perché il pool tiene 100 connessioni e spesso in fase di
sviluppo questi errori potrebbero non essere notati visto che solitamente
si esegue una navigazione monoutente. Un test di carico che simula già 30
accessi contemporanei non tarderà a far emergere eventuali
leak.
Alk.
powered by IMHO 1.3