2010-02-09 12 views
7

Supponiamo di avere una pagina ASP.NET. Nel gestore di eventi di caricamento della pagina, apro una connessione al database e faccio qualche elaborazione. Ma al termine dell'elaborazione, non chiudo esplicitamente la connessione chiamando il metodo CLOSE dell'oggetto connessione.Cosa succede se lascio una connessione di database aperta in una pagina Web ASP.NET

Ora che l'elaborazione della pagina sul lato server è terminata, il GC disporrà di tutte le variabili nella mia pagina e anche dell'oggetto di connessione. Ma quando viene eliminato, la connessione che è stata aperta in precedenza viene automaticamente chiusa? Voglio dire, quando GC dispone l'oggetto di connessione, chiude automaticamente la connessione stabilita con il server di database; o semplicemente getta l'oggetto di connessione e la connessione al database rimane aperta fino a quando il timeout della connessione si verifica nel database e quindi il server di database chiude la connessione da solo?

+0

Quando si dice "variabili" si intendono i campi membri della classe, o si intendono le variabili locali. –

+0

Intendevo le variabili locali, come alcune variabili dichiarate all'interno di un metodo di una classe. –

+0

PERICOLO !!!!!!!!! – jaywon

risposta

6

Il MSDN documentation è abbastanza chiaro su questo:

Se lo SqlConnection esce campo di applicazione, non sarà chiuso. Pertanto, , è necessario chiudere esplicitamente la connessione chiamando Close o Dispose. Chiudi e Disponi sono funzionalmente equivalenti.

utilizzare il using blocchi di averlo disposto automaticamente, o esplicitamente .Close() esso. I blocchi using sono preferiti.

Se si lasciano le connessioni aperte, l'applicazione potrebbe terminare le connessioni quando vengono tentate nuove richieste, causando errori. Ho affrontato un problema simile in un'applicazione che stavo eseguendo il debug. Gli sviluppatori originali non riuscivano a chiudere esplicitamente le connessioni su poche pagine e il traffico era abbastanza alto da far sì che gli utenti iniziassero a ricevere errori. Ho avvolto le connessioni offensive in un blocco using e il problema è andato via.

+0

La cosa divertente è che ci sono un paio di differenze tra Close e Dispose nella classe SqlConnection. Oltre ovviamente all'evidente differenza di poter riaprire la connessione dopo aver chiamato Close, la classe SqlConnection non viene cancellata dalla coda del finalizzatore (chiamando GC.SuppressFinalize (this)) durante una chiamata alla chiusura. Ciò aumenta la pressione sul GC. IMO questo è in realtà un bug nella classe SqlConnection. – Steven

2

Si dovrebbe usare using blocchi, quindi non sarà necessario porre la domanda:

using (var conn = new SqlConnection(connectionString)) 
{ 
    using (var cmd = new SqlCommand(commandText, conn)) 
    { 
     using (var reader = cmd.ExecuteReader()) 
     { 
      while (reader.Read()) { /* ... */ } 
     } 
    } 
} 
+0

Se utilizzo il blocco using, allora la connessione al database verrà chiusa dal gcc ?? –

+0

No. La connessione verrà chiusa alla fine del blocco utilizzando, anche se viene generata un'eccezione all'interno del blocco. –

+1

In realtà, la connessione con il database normalmente non verrà chiusa, ma verrà semplicemente restituita al pool di connessioni.Ma quando non si smaltisce (o si chiude) una connessione correttamente, si sta esaurendo il pool e si otterrà un'eccezione di timeout del pool di connessione. – Steven

3

connessione è rimasta aperta. Se hai molte visualizzazioni di pagina e molte connessioni aperte, puoi ottenere 500 errori.

3

Le connessioni non saranno chiuse fino al dopo il (non quando) l'oggetto della pagina è stato finalizzato e potrebbe essere un po 'di tempo. Sarebbe molto facile massimizzare il numero di connessioni disponibili e iniziare a ricevere errori.

1

la connessione non verrà chiusa se non è stata scelta da GC e se ci sono molti visitatori che risultano in molte connessioni, questo potrebbe essere orribile. Inoltre, se provate ad aprire una connessione aperta, si genera un errore, quindi è necessario verificare che sia meglio scriverlo usando il blocco o chiudere la connessione da soli.

Problemi correlati