2013-03-21 13 views
8

Continuo a trovare risultati contrastanti per questa domanda. Diamo un'occhiata a questo codice C# di eseguire una query SQL:Devo chiudere la connessione di SQL Server con la parola chiave using?

using (SqlConnection cn = new SqlConnection(strConnectString)) 
{ 
    cn.Open(); 

    using (SqlCommand cmd = new SqlCommand(strSQL, cn)) 
    { 
     cmd.ExecuteNonQuery(); 
    } 

    //Do I need to call? 
    cn.Close(); 
} 

Devo chiamare quell'ultimo cn.Close()? Il motivo per cui ti sto chiedendo è che in un'app web con traffico intenso sono a corto di connessioni in una piscina.

risposta

10

Il using parola come usato qui:

using (SqlConnection cn = new SqlConnection(strConnectString)) 
{ 
    // Stuff 
} 

è l'abbreviazione di:

SqlConnection cn = null; 
try 
{ 
    cn = new SqlConnection(strConnectString); 
    // Stuff 
} 
finally 
{ 
    if (cn != null) cn.Dispose(); 
} 

cn.Dispose() saranno chiamati immediatamente dopo cn passa nell'ambito del using, che a sua volta immediatamente chiude la connessione (perché SqlConnection.Dispose() fa proprio questo).

UPDATE

Questo non deve essere confuso con la raccolta dei rifiuti. GC non è deterministico inNET, che è esattamente il motivo per cui sono state introdotte le interfacce IDisposable e Dispose Pattern. IDisposable consente di liberare risorse costose in modo tempestivo e deterministico.

1

Non è necessario chiudere la connessione quando si utilizza l'istruzione Using.

Scott hanselman lo spiega qui Why The Using Statement Is Better Than A Sharp Stick In The Eye And A SqlConnection Refactoring Example.

In un'app Web con traffico intenso sono a corto di connessioni in una piscina.

Assicurarsi che si stia utilizzando la stessa stringa di connessione in questo modo SQL utilizzerà Connection Pooling.

è la connessione chiusa immediatamente, o è chiuso quando il garbage collector arriva ad esso

Edit:

Il pattern Dispose viene utilizzato per fornire distruzione deterministica delle risorse. Poiché il garbage collector runtime .net non è deterministico (il che significa che non si può mai essere sicuri quando il runtime raccoglierà vecchi oggetti e chiamerà il loro finalizzatore). Pertanto, quando si implementa il pattern Dispose correttamente, si fornisce il rilascio deterministico delle risorse e nei casi in cui il consumatore è negligente e non dispone l'oggetto, il finalizzatore pulirà l'oggetto.

+0

Grazie. La domanda è: la connessione viene chiusa immediatamente oppure viene chiusa quando arriva il garbage collector? Perché questo fa la differenza nel mio caso. – c00000fd

+0

"Assicurati di utilizzare la stessa stringa di connessione" - cosa intendi con questo? Definisci 'SqlConnection cn' come variabile statica? – c00000fd

+1

"Finalizzazione non deterministica" = ** errato **. La connessione è * eliminata * immediatamente dopo essere uscito dall'ambito dell'istruzione 'using'. Questo non ha nulla a che fare con la garbage collection. In effetti, il GC non deterministico è esattamente il motivo per cui l'interfaccia IDisposable e il Dispose Pattern sono stati introdotti in .NET. –

1

Non è necessario chiuderlo se si utilizza using come chiama Displose() internamente.

Ecco alcuni dettagli sulla parola chiave using in ADO.NET, potrebbe valere la pena di essere letti.

Leveraging the "using" keyword in C#

Una rapida ricerca @SO si porterà a this post, dove si possono trovare le risposte anche lì.

Problemi correlati