.net - seleccionar - ocurrio un error en la base de datos
¿Cuáles son las consecuencias de no cerrar la conexión de la base de datos después de un error? (7)
Tengo una aplicación que está causando muchos dolores de cabeza. Es una aplicación .NET que se conecta a SQL Server 2005 a través de un servicio web. El programa tiene una grilla que se llena con un procedimiento almacenado de larga ejecución que tiende a agotar el tiempo de espera. En el caso en que se agote el tiempo de espera y se genere una SqlException, no hay manejo de la excepción para cerrar la conexión.
¿Cuáles son las consecuencias reales de esta condición? Creo que el framework o SQL Server probablemente lo solucione de una manera u otra, pero no estoy seguro.
Además, el programa siempre funciona bien por la mañana, pero después de aproximadamente una hora de uso, básicamente deja de funcionar. El problema no es que no sepa cómo codificar la conexión correctamente. Necesito saber si estos síntomas podrían ser causados por las conexiones no cerradas. Es una gran cosa cambiar el código de producción y me gustaría saber que al menos es posible que este sea el problema.
Conclusión Diseñé esta falla para que ocurra en cientos de conexiones simultáneas. Nunca pude reproducir la condición de falla en el entorno de la aplicación. Las mejores prácticas marcadas responden como correctas. Gracias a todos.
Como una conexión Sql se cierra durante la eliminación, generalmente uso esta sintaxis
using (SqlConnection conn = new SqlConnection())
{
// SqlCode here
}
El recolector de basura eventualmente finalizará su objeto de conexión abierta, pero no sabe cuándo aparecerá el GC la próxima vez. Hasta entonces, es posible que se quede sin conexiones en su grupo si tiene mucho tráfico o si se trata de un servidor sql compartido.
¿Por qué no eliminarlo en la sección final de tu bloque try / catch?
finally
{
if (cn != null)
{
cn.Dispose();
cn = null;
}
}
Esto debe hacerse en el método de servicio web, obviamente.
Esta es la razón por la cual la palabra clave ''usar'' es tan importante cuando se usa ADO.Net
using ( SqlConnection conn = new SqlConnection() )
{
...
}
Esto fuerza un tipo de recolección de basura determinista en el objeto ADO.Net utilizando la interfaz IDispose.
La mayoría del código de la base de datos usa una gran cantidad de cláusulas ''usando'' anidadas para ese propósito.
Hay un límite de conexión; si su aplicación se cuelga con frecuencia y no cierra las conexiones automáticamente, se denegarán las nuevas solicitudes de conexión.
Dicho esto, las conexiones se agotan después de un tiempo si no están cerradas.
Puede quedarse sin conexiones disponibles si sucede con la suficiente frecuencia, debería usar un sistema donde finalmente ejecute un comando para cerrar la conexión.
Si la aplicación deja de funcionar después de una hora más o menos, eso definitivamente podría deberse a que las conexiones no se cerrarán / eliminarán.
try
{
sqlCommandObject.Execute(); // this line will throw a timeout exception
}
finally
{
sqlConnectionObject.Close(); // this will execute no matter what happens
}