Heredé un marco web mediante el cual el desarrollador anterior ha abierto y cerrado sus conexiones a la base de datos en los métodos de inicio/descarga del ciclo de vida de la página. Esencialmente constructor es así (simplificado para demostrar el punto);Cerrar una conexión en el método de "descarga"
public class BasePage
{
protected DBConnection _conn;
public BasePage()
{
Init += StartConnection;
Unload += EndConnection;
}
private void StartConnection(object sender, EventArgs e)
{
_conn = new DBConnection(Application["connectionstring"].ToString());
}
private void EndConnection(object sender, EventArgs e)
{
if (_conn == null)
return;
if (_conn.Connection.State == ConnectionState.Open)
{
_conn.Close();
_conn.Dispose();
}
}
}
El desarrollo ha sido bastante rápido desde que llegué aquí, así que nunca dejé de considerarlo. Recientemente, las visitas han aumentado y hemos comenzado a recibir el temido error "Tiempo de espera caducado. El tiempo de espera transcurrido antes de obtener una conexión del grupo ...".
Actualmente estoy revisando el resto del código buscando posibles fugas de conexión, pero el código anterior nunca me ha sentado bien y quiero eliminarlo como un posible culpable. En la pregunta, entonces;
¿Puedo confiar en el método de "descarga" SIEMPRE se está llamando, incluso en el caso de una excepción? ¿O puede alguien ver otros posibles problemas utilizando el patrón anterior que lo haría un sospechoso principal para estas fugas de conexión?
Saludos,
Mikey
EDIT: En la depuración, el método de descarga siempre se llama, incluso si no es una excepción. Realmente solo necesito saber de cualquier escenario en el que no se llame a este método para poder averiguar si este es el bit que necesito para refactorizar primero.
EDITAR: Gracias a quienes han respondido hasta ahora, pero no hagan más recomendaciones sobre la clase IDisposable, o los patrones "usar" o "atrapar/finalmente": ¡esta no era mi pregunta! Mi pregunta es específicamente si una página podría ejecutar su evento "Init" pero luego no ejecutar es un evento "Descargar", y por qué esto podría suceder.
El método de descarga es del lado del servidor, por lo que seguramente no importaría lo que hizo el usuario una vez que se recibió la solicitud. –
"Para la página en sí, use este evento para realizar el trabajo final de limpieza, como cerrar archivos abiertos y conexiones de bases de datos, o terminar el registro u otras tareas específicas de la solicitud". Desde http://msdn.microsoft.com/en-us/library/ms178472.aspx. Así que es posible que estés en algo, pero de nuevo si miras el enlace Descargar en mi publicación verás que no siempre se llama. No cuento con que se me llame, si es posible, prefiero hacer lo que Pranay Rana sugirió, y esa sería la forma correcta de deshacerse de su conexión. – Jethro
Aquí también hay un interesante SO http://stackoverflow.com/questions/302149/is-it-acceptable-to-keep-a-db-connection-open-for-the-life-of-the-page link, tal vez el "Tiempo de espera expirado" es causado por otra cosa, intente utilizar el Analizador de SQL para ver qué sucede en segundo plano. – Jethro