2009-06-19 8 views
5

Ho il sospetto che una connessione al database utilizzata in una delle nostre applicazioni non sia sempre chiusa. Sono andato a vedere il codice e ho trovato una classe DataProvider che ha 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 è malvagio, non è solo il mio codice e non è comunque il punto della questione). Il metodo Dispose è implementato in questo modo:La chiusura di una connessione al database nel metodo Dispose è corretta?

protected virtual void Dispose(bool disposing) 
{ 
    if (!_disposed) 
    { 
     if (disposing) 
     { 
      if (_conn != null) 
       _conn.Close(); 
     } 

     _disposed = true; 
    } 
} 

La domanda è:
non garantisce sempre che la connessione è chiusa?
Questo codice è giusto?

Penso che ci dovrebbe essere _conn.Dispose() chiamato - ho ragione e potrebbe influenzare non chiudendo la connessione (probabilmente no)?

+0

Se si sospetta un sospetto controllando utilizzando i contatori delle prestazioni. – RichardOD

+0

Un valore chiave da verificare è NumberOfPooledConnections. – RichardOD

risposta

8

Dispose viene mai chiamato automaticamente.

Il collegamento non verrà chiuso finché il metodo smaltire l'oggetto è chiamato esplicitamente, o se la classe in utilizzato in un utilizzando() bloccare

Un modo più sicuro è quello di chiamare il metodo dispose nel finalizzatore e assicurarsi che il finalizzatore sia soppresso quando viene chiamato il metodo Dispose.

This article presente il modo corretto per implementare il modello

Speranza che aiuta!

Cédric

+0

ok ma se l'applicazione è chiusa (normalmente o per errore) verrà chiamato il metodo di smaltimento e la connessione verrà chiusa? – agnieszka

+0

Quando l'applicazione è spenta, tutti i finalizzatori dovrebbero essere chiamati dal garbage collector, quindi almeno le connessioni verranno chiuse mentre il finalizzatore degli oggetti Connection verrà attivato ... ma questo è un modo zoppo per chiudere una connessione;) –

+1

E a proposito: il metodo di smaltimento non viene mai chiamato automaticamente.Nello stato attuale del codice, le connessioni sono chiuse perché il metodo Dispose di Connection è chiamato nei loro finalizzatori –

2

conn.Dispose(); sarà anche chiudere la connessione, quindi non può ferire cambiarlo di seguire il modello smaltire.

Ma c'è funzionalmente equivalente, quindi deve esserci un problema dove.

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.close.aspx

Se lo SqlConnection esce portata, non saranno chiuse. Pertanto, , è necessario chiudere esplicitamente la connessione chiamando Close o Dispose. Chiudi e Disponi sono funzionalmente equivalenti. Se il valore di collegamento pool Pooling è impostato a true o yes, il sottostante collegamento è restituito di nuovo al pool connessione. D'altra parte, se Pooling è impostato su false o no, la connessione sottostante al server è chiusa a .