Los últimos días vemos demasiado este mensaje de error en nuestro sitio web:
"El tiempo de espera expiró. El período de tiempo de espera transcurrió antes de obtener una conexión del grupo. Esto puede haber ocurrido porque todas las conexiones agrupadas estaban en uso y se alcanzó el tamaño máximo del grupo".
No hemos cambiado nada en nuestro código en mucho tiempo. Revisé el código para verificar las conexiones abiertas que no se cerraron, pero encontré que todo estaba bien.
¿Como puedo resolver esto?
¿Necesito editar este grupo?
¿Cómo puedo editar el número máximo de conexiones de este grupo?
¿Cuál es el valor recomendado para un sitio web de alto tráfico?
Actualizar:
¿Necesito editar algo en IIS?
Actualizar:
Descubrí que el número de conexiones activas oscila entre 15 y 31, y descubrí que el número máximo permitido de conexiones configuradas en el servidor SQL es más de 3200 conexiones, son 31 demasiadas o debería editar algo en la configuración de ASP.NET ?
fuente
Respuestas:
En la mayoría de los casos, los problemas de agrupación de conexiones están relacionados con "fugas de conexión". Es probable que su aplicación no cierre sus conexiones a la base de datos de manera correcta y consistente. Cuando deja las conexiones abiertas, permanecen bloqueadas hasta que el recolector de basura .NET las cierra llamando a su
Finalize()
método.Desea asegurarse de que realmente está cerrando la conexión . Por ejemplo, el siguiente código provocará una pérdida de conexión, si el código entre
.Open
yClose
arroja una excepción:La forma correcta sería esta:
o
Cuando su función devuelve una conexión desde un método de clase, asegúrese de guardarla en caché localmente y llamar a su
Close
método. Perderá una conexión usando este código, por ejemplo:La conexión devuelta desde la primera llamada a
getConnection()
no se está cerrando. En lugar de cerrar su conexión, esta línea crea una nueva e intenta cerrarla.Si usa
SqlDataReader
o aOleDbDataReader
, ciérrelos. Aunque cerrar la conexión en sí parece hacer el truco, haga un esfuerzo adicional para cerrar los objetos del lector de datos explícitamente cuando los use.Este artículo " ¿Por qué se desborda un grupo de conexiones? " De MSDN / SQL Magazine explica muchos detalles y sugiere algunas estrategias de depuración:
sp_who
osp_who2
. Estos procedimientos almacenados del sistema devuelven información de lasysprocesses
tabla del sistema que muestra el estado y la información sobre todos los procesos de trabajo. En general, verá una ID de proceso del servidor (SPID) por conexión. Si nombró su conexión utilizando el argumento Nombre de aplicación en la cadena de conexión, sus conexiones de trabajo serán fáciles de encontrar.TSQL_Replay
plantilla SQLProfiler para rastrear conexiones abiertas. Si está familiarizado con Profiler, este método es más fácil que sondear utilizando sp_who.fuente
Al instalar .NET Framework v4.6.1, nuestras conexiones a una base de datos remota comenzaron a expirar inmediatamente debido a este cambio .
Para solucionarlo, simplemente agregue el parámetro
TransparentNetworkIPResolution
en la cadena de conexión y configúrelo en falso :fuente
A menos que su uso haya aumentado mucho, parece poco probable que solo haya una acumulación de trabajo. En mi opinión, la opción más probable es que algo está usando conexiones y no las está liberando rápidamente. ¿Estás seguro de que estás usando
using
en todos los casos? ¿O (a través de cualquier mecanismo) liberando las conexiones?fuente
¿Comprobó si hay DataReaders que no están cerrados y response.redirects antes de cerrar la conexión o un lector de datos? Las conexiones permanecen abiertas cuando no las cierra antes de una redirección.
fuente
Nos encontramos con este problema de vez en cuando en nuestro sitio web también. El culpable en nuestro caso es que nuestras estadísticas / índices se están desactualizando. Esto hace que una consulta que se ejecuta rápidamente anteriormente se vuelva (eventualmente) lenta y se agote el tiempo de espera.
Intente actualizar las estadísticas y / o reconstruir los índices en las tablas afectadas por la consulta y vea si eso ayuda.
fuente
Puede especificar el tamaño mínimo y máximo de la agrupación especificando
MinPoolSize=xyz
y / oMaxPoolSize=xyz
en la cadena de conexión. Sin embargo, esta causa del problema podría ser algo diferente.fuente
También he encontrado este problema cuando uso una capa de datos de terceros en una de mis aplicaciones .NET. El problema era que la capa no cerraba las conexiones correctamente.
Tiramos la capa y creamos una nosotros mismos, que siempre cierra y elimina las conexiones. Desde entonces ya no recibimos el error.
fuente
También puede probar eso, para resolver el problema del tiempo de espera:
Si no agregó httpRuntime a su configuración web, agréguelo a la
<system.web>
etiquetay
Modifique su cadena de conexión de esta manera;
Por ultimo uso
fuente
Esto se debe principalmente a que la conexión no se ha cerrado en la aplicación. Use "MinPoolSize" y "MaxPoolSize" en la cadena de conexión.
fuente
En mi caso, no estaba cerrando el objeto DataReader.
fuente
Si está trabajando en un código heredado complejo en el que no es posible usar (..) {..} de manera simple, tal como estaba, puede consultar el fragmento de código que publiqué en esta pregunta SO para conocer la forma de determinar pila de llamadas de la creación de la conexión cuando una conexión se pierde potencialmente (no se cierra después de un tiempo de espera establecido). Esto hace que sea bastante fácil detectar la causa de las fugas.
fuente
No cree instancias de la conexión sql demasiadas veces. Abra una o dos conexiones y úselas para todas las siguientes operaciones sql.
Parece que incluso cuando se
Dispose
conectan las conexiones se produce la excepción.fuente
Además de las soluciones publicadas ...
Al tratar con 1000 páginas de código heredado, cada una llamando a un GetRS común varias veces, aquí hay otra manera de solucionar el problema:
En una DLL común existente, agregamos la opción CommandBehavior.CloseConnection :
Luego, en cada página, siempre que cierre el lector de datos, la conexión también se cerrará automáticamente para evitar fugas de conexión.
fuente
Simplemente tuve el mismo problema y quería compartir lo que me ayudó a encontrar la fuente: agregue el nombre de la aplicación a su cadena de conexión y luego motive la conexión abierta al servidor SQL
fuente
Este problema que tuve en mi código. Pegaré un código de ejemplo que he pasado por debajo del error. El tiempo de espera transcurrió antes de obtener una conexión del grupo. Esto puede haber ocurrido porque todas las conexiones agrupadas estaban en uso y se alcanzó el tamaño máximo de la agrupación.
Desea cerrar la conexión cada vez. Antes de eso, no nos conecté de cerca debido a esto recibí un error. Después de agregar una declaración cercana, he recibido este error
fuente
Has filtrado conexiones en tu código. Puede intentar usar el uso para certificar que los está cerrando.
https://blogs.msdn.microsoft.com/angelsb/2004/08/25/connection-pooling-and-the-timeout-expired-exception-faq/
fuente
Este problema me he encontrado antes. Terminó siendo un problema con el firewall. Acabo de agregar una regla al firewall. Tuve que abrir el puerto
1433
para que el servidor SQL pueda conectarse al servidor.fuente
Utilizar este:
fuente
SqlConnection.ClearPool
, pero ¿eso solo impide que su conexión actual se libere al grupo de conexiones? Pensé que la idea del grupo de conexiones era permitir conexiones más rápidas. ¿Seguramente liberar la conexión del grupo cada vez que termine significa que se necesitará crear una NUEVA conexión CADA VEZ que se necesite una, en lugar de extraer una de repuesto del grupo? Por favor explique cómo y por qué esta técnica es útil.Sí, hay una manera de cambiar la configuración. Si está en un servidor dedicado y simplemente necesita más conexiones SQL, puede actualizar las entradas de "tamaño máximo de agrupación" en ambas cadenas de conexión siguiendo estas instrucciones:
Encuentre sus cadenas de conexión, estas se verán similares a los ejemplos a continuación:
"add name =" SiteSqlServer "connectionString =" servidor = (local); base de datos = dbname; uid = dbuser; pwd = dbpassword; pooling = true; conexión de por vida = 120; tamaño máximo de pool = 25; ""
5. Cambie el tamaño máximo del grupo = valor X al tamaño del grupo requerido.
fuente
Asegúrese de establecer la configuración correcta para el grupo de conexiones. Esto es muy importante como lo he explicado en el siguiente artículo: https://medium.com/@dewanwaqas/configurations-that-significantly-improves-your-app-performance-built-using-sql-server-and-net- ed044e53b60 Verá una mejora drástica en el rendimiento de su aplicación si la sigue.
fuente
En mi caso, tenía un bucle infinito (de una propiedad get que intentaba obtener valor de la base de datos) que seguía abriendo cientos de conexiones SQL.
Para reproducir el problema intente esto:
fuente