c# - Tiempo de espera de conexión para el servidor SQL
asp.net sql-server (3)
Hmmm ...
Como dijo Darin, puede especificar un valor de tiempo de espera de conexión mayor, pero dudo que ese sea realmente el problema.
Cuando obtiene tiempos de espera de conexión, normalmente es un problema con uno de los siguientes:
Configuración de red: conexión lenta entre su servidor web / caja dev y el servidor SQL. Aumentar el tiempo de espera puede corregir esto, pero sería conveniente investigar el problema subyacente.
Cadena de conexión. He visto problemas en los que un nombre de usuario / contraseña incorrectos, por alguna razón, da un error de tiempo de espera en lugar de un error real que indica "acceso denegado". Esto no debería suceder, pero tal es la vida.
Cadena de conexión 2: si especifica el nombre del servidor incorrectamente o de manera incompleta (por ejemplo,
mysqlserver
lugar demysqlserver.webdomain.com
), obtendrá un tiempo de espera. ¿Puedes hacer ping al servidor usando el nombre del servidor exactamente como se especifica en la cadena de conexión desde la línea de comando?Cadena de conexión 3: si el nombre del servidor está en su DNS (o archivo de hosts), pero apuntando a una dirección IP incorrecta o inaccesible, obtendrá un error de tiempo de espera en lugar de un error de máquina no encontrada.
La consulta que está llamando se está agotando. Puede parecer que la conexión al servidor es el problema, pero, dependiendo de cómo esté estructurada su aplicación, podría llegar hasta el escenario donde se está ejecutando su consulta antes de que se agote el tiempo de espera.
Fugas de conexión. ¿Cuántos procesos se están ejecutando? ¿Cuántas conexiones abiertas? No estoy seguro de si ADO.NET sin procesar realiza la agrupación de conexiones, cierra automáticamente las conexiones cuando es necesario en Enterprise Library, o donde todo está configurado. Esto es probablemente una pista falsa. Sin embargo, cuando trabajo con WCF y servicios web, he tenido problemas con las conexiones no cerradas que causan tiempos de espera y otros comportamientos impredecibles.
Cosas para intentar:
¿Obtiene un tiempo de espera cuando se conecta al servidor con SQL Management Studio? Si es así, la configuración de red probablemente sea el problema. Si no ve un problema al conectarse con Management Studio, el problema estará en su aplicación, no en el servidor.
Ejecute el Analizador de SQL, y vea lo que realmente está pasando por el cable. Debería poder decir si realmente se está conectando, o si una consulta es el problema.
Ejecute su consulta en Management Studio y vea cuánto tarda.
¡Buena suerte!
¿Puedo aumentar el tiempo de espera modificando la cadena de conexión en web.config
?
Sí, podría añadir ;Connection Timeout=30
a su cadena de conexión y especificar el valor que desea.
El valor de tiempo de espera establecido en la propiedad Connection Timeout
es un tiempo expresado en segundos . Si esta propiedad no está configurada, el valor de tiempo de espera para la conexión es el valor predeterminado (15 segundos).
Además, al establecer el valor de tiempo de espera en 0
, está especificando que su intento de conexión espera un tiempo infinito. Como se describe en la documentación, esto es algo que no debe establecer en su cadena de conexión:
Un valor de 0 indica que no hay límite, y debe evitarse en un ConnectionString porque un intento de conexión espera indefinidamente.
Si desea cambiarlo dinámicamente, prefiero usar SqlConnectionStringBuilder .
Le permite convertir ConnectionString, es decir, una cadena en Object de clase, todas las propiedades de la cadena de conexión se convertirán en su miembro.
En este caso, la verdadera ventaja sería que no debe preocuparse si la parte de la cadena ConnectionTimeout ya existe en la cadena de conexión o no.
Además, como crea un objeto, siempre es bueno asignarle valor en el objeto en lugar de manipular la cadena.
Aquí está el ejemplo del código:
var sscsb = new SqlConnectionStringBuilder(_dbFactory.Database.ConnectionString);
sscsb.ConnectTimeout = 30;
var conn = new SqlConnection(sscsb.ConnectionString);