Domanda

Oggi ho trovato un bug in uno dei nostri progetti: esiste una connessione con il database che non viene mai chiusa, intendo il metodo Close () non viene mai chiamato. Tuttavia, quando chiudo l'applicazione, la connessione viene chiusa (verificato più volte in sql management studio). Perché?

È stato utile?

Soluzione

La connessione verrà chiusa all'uscita dall'applicazione. Leggi su Finalizza SqlConnection . Dalla documentazione di MSDN per Object.Finalize :

" Durante l'arresto di un dominio applicazione, Finalize viene automaticamente chiamato su oggetti che non sono esenti da finalizzazione, anche quelli che sono ancora accessibili. "

Altri suggerimenti

Un'altra cosa da tenere a mente qui è che in .Net, puoi avvolgere le tue connessioni in un blocco usando, e questo chiuderà e disporrà le tue connessioni per te. Quindi la mancanza di un Close () esplicito non è una brutta cosa se hai i tuoi blocchi usando lì ...

// this using block will auto close & dispose your connection...
using (var conn = new SqlConnection(...))
{
    conn.Open();
    // database code here with no explicit close

}

che è l'equivalente funzionale di un blocco try / finally con un conn.close nell'infinito. Molti sviluppatori trascurano l'uso dei blocchi: assicurati di non fare lo stesso in questo caso.

Se si riscrive il codice per chiudere le connessioni, è buona norma utilizzare l'utilizzo dei blocchi attorno a tutti gli oggetti del database (connessione, comando, lettore) per assicurarsi che si chiudano e si eliminino quando non rientrano nell'ambito di il blocco utilizzando. Suggerirei sicuramente di scriverli nel tuo codice anziché semplicemente conn.Close () dove necessario.

Le connessioni SQL sono costose da creare e ADO.NET utilizza una tecnica chiamata pool di connessioni che consente di riutilizzarle.

Citazione da MSDN :

  

Ti consigliamo vivamente di farlo   chiudi sempre la connessione quando   hanno finito di usarlo in modo che lo faccia   essere restituito al pool di connessioni e   essere riutilizzato.

     

Se la dimensione massima del pool è stata   raggiunto e nessuna connessione utilizzabile è   disponibile, la richiesta è in coda. Il   pooler quindi tenta di recuperare qualsiasi   connessioni fino al timeout   raggiunto (il valore predefinito è 15 secondi).   Se il pooler non è in grado di soddisfare il   richiesta prima dei tempi di connessione   , viene generata un'eccezione.

Quando esci dall'applicazione in modo regolare, mi aspetto che i finalizzatori vengano eseguiti. Chiuderanno la connessione se è ancora aperta. Basta non dipendere da questo: potrebbe volerci un po 'prima che quei finalizzatori vengano eseguiti nel normale funzionamento della tua applicazione, quindi manterrai troppe connessioni aperte.

Quando l'applicazione si arresta in modo anomalo, forse il finalizzatore non verrà eseguito, lasciando la connessione aperta oltre la durata dell'applicazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top