2012-05-16 18 views
5

Tenemos un servicio WCF alojado en IIS, ejecutándose en un servidor. El servicio se conecta a una instancia de SQL Server que se ejecuta en otro servidor. En nuestro código, abrimos y cerramos la conexión para cada solicitud. El servicio WCF realiza varias solicitudes por minuto a la base de datos.¿Qué puede hacer que SqlClient reutilice las conexiones no válidas?

Si reinicio el servicio SQL sin detener el servicio WCF, el servicio WCF comienza a registrar errores en nuestro registro de errores, lo cual es perfectamente normal.

El problema es que a veces (no siempre), después de que el servicio de SQL se ha reiniciado, el servicio WCF continúa informes de este error en cada petición:

Cannot open database "mydatabase" requested by the login. The login failed." 

El seguimiento de la pila del error termina con:

at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) 
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) 
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) 
at System.Data.SqlClient.SqlConnection.Open() 

Mientras esto sucede, puedo conectarme a la base de datos utilizando SQL Management Studio (desde la misma máquina que ejecuta el servicio WCF). Para solucionar el problema, tengo que reciclar el grupo de aplicaciones para mi servicio WCF.

Así que mi pregunta es: ¿Qué puede causar esto y qué puedo hacer para asegurar que mi aplicación pueda recuperarse de un reinicio de SQL?

P.S .: En mi cuadro de desarrollo (también ejecutando IIS), cuando hago la misma prueba me sale el mismo error varias veces (mientras que la base de datos se comienza a cargar, supongo) y luego vuelve a funcionar.

+0

Es posible que desee tratar de atrapar la SqlException y verificar el código de error específico, luego llamar a SqlConnection.ClearPool (sqlConnection); luego vuelva a intentar la declaración una vez más – Termit

Respuesta

1

A veces, la conexión que obtiene de la agrupación es nueva (y su intento de conexión tiene éxito), otras veces se reutiliza una conexión y falla el intento de conexión. No todas las conexiones cortadas realmente se vuelven a utilizar, porque la agrupación puede o no detectar la condición y eliminar dicha conexión del conjunto.

From here:

Si existe una conexión a un servidor que ha desaparecido, es posible para esta conexión que puede extraerse de la piscina, incluso si el pooler conexión no se ha detectado la conexión cortada y marcada como inválido. Cuando esto ocurre, se genera una excepción. Sin embargo, aún debe cerrar la conexión para volver a liberarla en el grupo.

Si crea conexiones muy raramente, por lo que no hay implicaciones de rendimiento, es mejor desactivar la agrupación. Simplemente configure Pooling en no en la cadena de conexión.

Cuestiones relacionadas