Pregunta

Más temprano hoy he encontrado un error en uno de nuestros proyectos: hay una conexión con la base de datos que nunca se cierra, es decir, nunca se llama al método Close (). Sin embargo, cuando cierro la aplicación, la conexión se cierra (se verifica en el estudio de administración de SQL muchas veces). ¿Por qué?

¿Fue útil?

Solución

La conexión se cerrará cuando la aplicación salga. Lea sobre SqlConnection's Finalize . De la documentación de MSDN para Object.Finalize :

" Durante el cierre de un dominio de aplicación, Finalize se llama automáticamente a los objetos que no están exentos de finalización, incluso aquellos que aún están accesibles. "

Otros consejos

Otra cosa a tener en cuenta aquí es que en .Net, puede envolver sus conexiones en un bloque de uso, y eso cerrará y eliminará sus conexiones por usted. Entonces, la falta de un Close () explícito no es algo malo si tienes bloques de uso allí ...

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

}

que es el equivalente funcional de un bloque try / finally con un conn.close en el final. Muchos desarrolladores pasan por alto el uso de bloques: asegúrese de que no esté haciendo lo mismo en este caso.

Si reescribe su código para cerrar sus conexiones, es una buena práctica usar Usar bloques alrededor de todos los objetos de su base de datos (conexión, comando, lector) para asegurarse de que se están cerrando y desechando cuando caen fuera del alcance de El bloque de uso. Definitivamente sugeriría escribirlos en su código en lugar de solo con.Close () donde sea necesario.

Las conexiones SQL son caras de crear y ADO.NET utiliza una técnica llamada agrupación de conexiones que permite reutilizarlas.

Cita de MSDN :

  

Se recomienda encarecidamente que   siempre cierra la conexión cuando   han terminado de usarlo para que lo haga   ser devuelto al grupo de conexiones y   ser reutilizado

     

Si el tamaño máximo de la agrupación ha sido   alcanzado y no hay conexión utilizable   disponible, la solicitud está en cola. los   Pooler luego intenta reclamar cualquier   conexiones hasta que se agote el tiempo de espera   alcanzado (el valor predeterminado es 15 segundos).   Si el grupo no puede satisfacer el   solicitar antes de los tiempos de conexión   fuera, se lanza una excepción.

Cuando salga de la aplicación de manera regular, espero que se ejecuten los finalizadores. Cerrarán la conexión si aún está abierta. Simplemente no dependa de esto: puede pasar un tiempo antes de que esos finalizadores se ejecuten en el funcionamiento normal de su aplicación, por lo que mantendrá abiertas demasiadas conexiones.

Cuando la aplicación falla, tal vez el finalizador no se ejecute, dejando la conexión abierta después de la vida útil de la aplicación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top