A differenza di quanto accade con ADO, in ADO.NET una mancata chiusura della connessione al database può portare a problemi ben più gravi, come la mancanza di connessioni disponibili per altri client.
Se infatti nel primo caso l'oggetto esce dallo scope non appena la pagina è eseguita, nel secondo la sua gestione viene demandata al Garbage Collector, che si occuperò di fare il dispose degli oggetti.
Ciò che è necessario rimarcare è che il GC interviene in modo non deterministico, che vuol dire, in parole povere, che è probabile che l'oggetto che rappresenta la connessione prima di essere scaricato può rimanere attivo anche per ore.
Per questo motivo, più che mai, con ADO.NET è quanto mai opportuno chiudere esplicitamente le connessioni.
L'esempio più significativo è un errore che si verifichi dopo aver aperto il database, cosa che porta alla non esecuzione del metodo Close.
Un ottimo sistema per evitare questo comportamento è utilizzare un blocco try..finally, come segue:
Dim conn as SqlConnection = new SqlConnection(connString) Try conn.Open() ' operazioni che leggono dal database Finally ' chiusura connessione conn.Close() End Try
Altro sistema, così come documentato nello script #605, consiste nell'utilizzare, con C#, using, in questo modo:
using (SqlConnection conn = new SqlConnection(connString)) { // operazioni } // .Dispose invocato automaticamente
Approfondimenti
#605 - Using ed il Dispose automatico con C#
https://www.aspitalia.com/liste/usag/script.aspx?ID=605
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Personalizzare l'errore del rate limiting middleware in ASP.NET Core
Short-circuiting della Pipeline in ASP.NET Core
Eseguire una query su SQL Azure tramite un workflow di GitHub
Load test di ASP.NET Core con k6
Implementare il throttling in ASP.NET Core
Effettuare il deploy di immagini solo da container registry approvati in Kubernetes