2010-02-09 49 views
7

Supongamos que tengo una página ASP.NET. En el controlador de eventos de carga de página, abro una conexión a la base de datos y hago algún procesamiento. Pero una vez hecho el procesamiento, no cierro la conexión explícitamente llamando al método CLOSE del objeto de conexión.Qué sucede si dejo abierta una conexión de base de datos en una página web de ASP.NET

Ahora, cuando finaliza el procesamiento de página en el servidor, el GC eliminará todas las variables de mi página y también el objeto de conexión. Pero cuando se elimina, ¿la conexión que se abrió anteriormente se cierra automáticamente? Quiero decir, cuando GC dispone el objeto de conexión, cierra automáticamente la conexión que se estableció con el servidor de la base de datos; o simplemente descarta el objeto de conexión, y la conexión en la base de datos permanece abierta, hasta que el tiempo de espera de la conexión ocurre en la base de datos y luego el servidor de la base de datos cierra la conexión por sí mismo?

+0

Cuando dices "variables" te refieres a los campos de miembros de tu clase, o te refieres a variables locales. –

+0

Quise decir variables locales, como alguna variable que se declara dentro de un método de una clase ... –

+0

¡PELIGRO !!!!!!!!! – jaywon

Respuesta

6

El MSDN documentation es bastante claro al respecto:

Si el SqlConnection sale de alcance, no se cerrará. Por lo tanto, debe cerrar explícitamente la conexión llamando a Close o Dispose. Close y Dispose son funcionalmente equivalentes.

utilizar el using bloques tenerlo dispuesto de forma automática, o explícitamente .Close() ella. Se prefieren los bloques using.

Al dejar conexiones abiertas, su aplicación puede eventualmente quedarse sin conexiones cuando se intentan nuevas solicitudes, lo que produce errores. Me enfrenté a tal problema en una aplicación que estaba depurando. Los desarrolladores originales no cerraron las conexiones de forma explícita en unas pocas páginas y el tráfico fue lo suficientemente alto como para que los usuarios comenzaran a recibir errores. Envolví las conexiones ofensivas en un bloque using y el problema desapareció.

+0

Lo curioso es que hay un par de diferencias entre Cerrar y Eliminar en la clase SqlConnection. Además, por supuesto, la diferencia obvia de poder volver a abrir la conexión después de llamar a Close, la clase SqlConnection no se cancela desde la cola del finalizador (llamando a GC.SuppressFinalize (this)) durante una llamada para cerrarla. Esto aumenta la presión en el GC. OMI esto es realmente un error en la clase SqlConnection. – Steven

2

Debe utilizar using bloques, entonces usted no tendrá que hacer la pregunta:

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

Si utilizo el bloque de uso, ¿la conexión en la base de datos será cerrada por el gcc? –

+0

No. La conexión se cerrará al final del bloque de uso, incluso si se lanza una excepción dentro del bloque. –

+1

En realidad, la conexión con la base de datos normalmente no se cerrará, sino que simplemente se devuelve al grupo de conexiones.Pero cuando no desecha (o cierra) una conexión correctamente, está agotando el grupo y, finalmente, obtendrá una excepción de tiempo de espera del grupo de conexión. – Steven

3

conexión se mantuvo abierto. Si tiene muchas páginas vistas y muchas conexiones abiertas, puede obtener un error de 500.

3

Sus conexiones no se cerrarán hasta después de (no cuando) el objeto de su página esté finalizado, y eso podría demorar un tiempo. Sería muy fácil maximizar la cantidad de conexiones disponibles y comenzar a recibir errores.

1

su conexión no se cerrará a menos que sea elegida por GC y si tiene muchos visitantes dando como resultado muchas conexiones, esto puede ser horrible. Además, si intenta abrir una conexión abierta, generará un error, por lo que debe verificar si hay alguna mejor, ya sea que la escriba usando un bloque o que cierre la conexión usted mismo.

Cuestiones relacionadas