Tenemos un código de cliente que está utilizando la clase SqlConnection en .NET para hablar con una base de datos SQLServer. Es intermitente está fallando con este error:.NET Clase SqlConnection, agrupación de conexiones y lógica de reconexión
"ExecuteReader requiere una conexión abierta y disponible estado actual de la conexión se cierra."
La solución "temporal" es reiniciar el proceso, después de lo cual todo funciona - sin embargo, eso es obviamente insatisfactorio.
El código mantiene un caché de instancias de SqlConnection, una para cada base de datos.
Nos gustaría volver a escribir el código, pero antes de hacerlo, necesito saber algunas cosas:
Mi primera pregunta es: ¿Es ineficiente para conectar y desconectar repetidamente objetos SqlConnection, o hace la biblioteca subyacente realiza la agrupación de conexiones en nuestro nombre?
// Is this bad/inefficient?
for(many-times)
{
using(SQLConnection conn = new SQLConnection(connectionString))
{
// do stuff with conn
}
}
Debido a que nuestro código hace no hacer lo anterior, lo que parece ser la causa más probable del problema es que algo le sucede a la base de datos SQL Server subyacente durante el "tiempo de vida" de la conexión que hace que la conexión a cerrarse ...
Si resulta que vale la pena "almacenar en caché" objetos SqlConnection, ¿cuál es la forma recomendada de manejar todos los errores que podrían resolverse simplemente "reconectando" a la base de datos. Estoy hablando de escenarios tales como:
- La base de datos se desconecta y se vuelve a conectar, pero el proceso de cliente no tenía transacciones abiertas mientras esto ocurría
- La base de datos fue "desconectado", luego "reconecté "
Me di cuenta de que hay una propiedad de" Estado "en SqlConnection ... ¿hay una forma adecuada de consultar eso?
Por último, tengo una instancia de SQL Server configuración de prueba con los derechos de acceso: ¿cómo puedo ir sobre reproducir el error exacto "ExecuteReader requiere una conexión abierta y disponible estado actual de la conexión se cierra"
Lo que esperaba escuchar ... ¿Alguna idea sobre cómo podría reproducir el error exacto que estamos viendo? (solo para "probar" que he solucionado el problema) –
Es difícil de decir, para ser honesto. Podría ser una condición de carrera si intentas usar la misma conexión desde múltiples hilos. –
Para deshabilitar la agrupación de conexiones: agregue "Pooling = False;" a la cadena de conexión. – Richard