La chiusura di una connessione al database nel metodo Dispose è corretta?
-
06-07-2019 - |
Domanda
Ho avuto il sospetto che una connessione al database utilizzata in una delle nostre applicazioni non fosse sempre chiusa. Sono andato a vedere il codice e ho trovato un DataProvider
di classe con l'oggetto SqlConnection
. La connessione è aperta nel costruttore di questa classe e chiusa nel suo metodo Dispose
(non giudicarlo, so che mantenere una connessione aperta è male, non è solo il mio codice e non è il punto di la domanda comunque). Il metodo Dispose
è implementato in questo modo:
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
if (_conn != null)
_conn.Close();
}
_disposed = true;
}
}
La domanda è:
Garantisce sempre che la connessione sia chiusa?
Questo codice è giusto?
Penso che dovrebbe essere chiamato _conn.Dispose ()
- ho ragione e potrebbe influire sul fatto di non chiudere la connessione (probabilmente no)?
Soluzione
Dispose non viene mai chiamato automaticamente.
La connessione non verrà chiusa fino a quando non viene esplicitamente chiamato il metodo Dispose dell'oggetto o se la classe viene utilizzata in un blocco using ()
Un modo più sicuro consiste nel chiamare il metodo dispose nel finalizzatore e assicurarsi che il finalizzatore venga eliminato quando viene chiamato il metodo Dispose.
Questo articolo presenta il modo corretto di implementare il modello
Spero che sia d'aiuto!
C & # 233; dric
Altri suggerimenti
conn.Dispose ();
chiuderà anche la connessione, quindi non puoi fare a meno di cambiarla per seguire il modello di disposizione.
Ma funzionalmente equivalente quindi ci deve essere un altro problema dove.
http://msdn.microsoft .com / it-it / library / system.data.sqlclient.sqlconnection.close.aspx
Se SqlConnection si spegne ambito, non sarà chiuso. Perciò, è necessario chiudere esplicitamente il file connessione chiamando Chiudi o Dispose. Chiudi e smaltisci funzionalmente equivalente. Se la valore del pool di connessioni Il pooling è impostato su vero o sì, il sottostante la connessione viene restituita al pool di connessioni. D'altra parte, se Il pooling è impostato su false o no, il la connessione sottostante al server è chiuso.