Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Vincoli di memoria, allocazioni e Garbage Collection di SQL Server e .NET

Il problema è che, per qualche motivo, il tuo DataReader non viene chiuso. Un'eccezione? L'utente del metodo non si è ricordato di chiudere DataReader?

Una funzione che restituisce un DataReader da utilizzare al di fuori del suo corpo lascia la responsabilità di chiuderlo al codice esterno, quindi non vi è alcuna garanzia che il Reader venga chiuso. Se non chiudi il lettore, non puoi riutilizzare la connessione in cui è stato aperto.

Quindi restituire un DataReader da una funzione è una pessima idea!

Puoi vedere un'intera discussione su questo argomento qui .

Cerca gli usi di questa funzione (GetDataReader ), e controlla se c'è la garanzia che il lettore venga chiuso. E, soprattutto, che non vi è alcuna possibilità che questo codice rientri e utilizzi la stessa raccolta per aprire un nuovo DataReader prima che il primo venga chiuso. (Non lasciarti trarre in inganno da CommandBehavior.CloseConnection. Questo si occupa solo di chiudere la connessione quando il DataReader è chiuso... solo se non manchi di chiuderlo)