10

Tengo un gran problema aquí, en mi servidor.Más de 100 conexiones al servidor sql 2008 en estado "inactivo"

Tengo un ASP .net web (framework 4.x) ejecutándose en mi servidor, todas las transacciones/select/update/insert se hacen con ADO.NET.

El problema es que después de haber estado usando durante un tiempo (un par de actualizaciones/Selecciona/inserciones) a veces me dieron más de 100 conexiones en "dormir" el estado cuando el registro de las conexiones en el servidor SQL con esta consulta:

SELECT 
spid, 
a.status, 
hostname, 
program_name, 
cmd, 
cpu, 
    physical_io, 
    blocked, 
    b.name, 
    loginame 
FROM 
    master.dbo.sysprocesses a INNER JOIN 
    master.dbo.sysdatabases b ON 
    a.dbid = b.dbid where program_name like '%TMS%' 
ORDER BY spid 

He estado revisando mi código y cerrando cada vez que hago una conexión, voy a probar la nueva clase, pero me temo que el problema no se soluciona.

Supongo que la agrupación de la conexión, mantenga las conexiones para volver a utilizarlos, pero hasta que vea no los vuelva a utilizar siempre.

¿Alguna idea además de verificar para cerrar todas las conexiones abiertas después de usarlas?

SOLUCIONADO (ahora tienen un solo y la conexión hermosa en estado "durmiente"):

Además de la anwser de David Stratton, me gustaría compartir este enlace que ayudan a explicar muy bien cómo el agrupación de conexiones funciona: http://dinesql.blogspot.com/2010/07/sql-server-sleeping-status-and.html

para ser breve, es necesario cerrar todas las conexiones (objetos de conexión SQL) con el fin de que la agrupación de conexiones puede volver a utilizar la conexión y el uso de la misma cadena connectinos, para asegurar que este es muy recomendable el uso uno de los webConfig.

Ten cuidado con los dataReaders con los que deberías cerrar su conexión (eso fue lo que me enloqueció).

+0

Puede obtener más y mejores respuestas en [dba.stackexchange.com] (http://dba.stackexchange.com) donde los DBA de tiempo completo se juntan –

Respuesta

16

Parece que es la agrupación de conexiones.

A partir de aquí: http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx

Un grupo de conexión se crea para cada cadena de conexión única. Cuando se crea un grupo , se crean varios objetos de conexión y se agregan al grupo para que se cumpla el requisito de tamaño mínimo de grupo. Las conexiones se agregan a la agrupación según sea necesario, hasta el tamaño máximo de la agrupación especificado (100 es el valor predeterminado). Las conexiones se liberan en la piscina cuando están cerradas o desechadas.

Para asegurarse de que no está creando piscinas innecesarios, asegúrese de que la misma cadena de conexión exacta que se utiliza cada vez que se conecte - guarde en el archivo .config.

También puede reducir el tamaño máximo de la piscina si lo desea.

En realidad, yo recomendaría simplemente leer todo el artículo vinculado anteriormente. Habla acerca de la limpieza de las agrupaciones y le brinda las mejores prácticas para utilizar la agrupación de manera adecuada.

Editar - añade el día siguiente

Las piscinas en el servidor están allí debido a cómo funciona la Agrupación de conexiones. Por la documentación vinculada a la anterior:

El pooler conexión elimina una conexión de la agrupación después de que haya estado inactivo durante mucho tiempo, o si el pooler detecta que la conexión con el servidor ha sido cortada. Tenga en cuenta que una conexión cortada solo se puede detectar después de intentar comunicarse con el servidor . Si se encuentra una conexión que ya no está conectada al servidor , se marca como no válida. Las conexiones no válidas se eliminan del grupo de conexiones solo cuando se cierran o recuperan.

Esto significa que el servidor en sí mismo limpiará esas agrupaciones eventualmente, si no se utilizan. Si NO se limpian, l significa que el servidor cree que las conexiones todavía están en uso y se está quedando pendiente de ellas para aumentar su rendimiento.

En otras palabras, no me preocuparía a menos que vea un problema. La agrupación de conexiones está sucediendo exactamente como debería ser.

Si realmente desea borrar las piscinas, una vez más, por la documentación:

Borrado de la piscina

ADO.NET 2.0 introduce dos nuevos métodos para clara: la piscina y ClearAllPools ClearPool. ClearAllPools borra las agrupaciones de conexiones para un proveedor determinado, y ClearPool borra la agrupación de conexiones que está asociada a una conexión específica. Si hay conexiones que se utilizan en el momento de la llamada, son marcados adecuadamente. Cuando están cerrados, se descartan en su lugar de ser devueltos al grupo.

Sin embargo, si desea ajustar la agrupación, se puede modificar Connection String. Ver esta página, y la búsqueda de la palabra "pool":

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring.aspx

O se puede dar de alta un DBA para ayudar a establecer y poner en común a nivel de servidor. Eso está fuera de tema aquí, pero ServerFault.com podría tener personas para ayudar allí.

+0

Hola, antes de preguntar, termino leyendo ese artículo. Pero, ¿qué quieres decir con la misma cadena de conexión? te refieres al "objeto" o la cadena, voy a intentar usar también la webConfig en lugar de los atributos de la clase. ¿Dónde puedo limitar el grupo de conexiones? Gracias. – Allende

+0

Supongo que todas las respuestas están aquí http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring.aspx Lo siento. Voy a verificar esto y eventualmente actualizar la pregunta. – Allende

+0

No puedo encontrar la manera correcta de usar la "misma cadena de conexión". Lo uso ahora desde la configuración web y todavía tengo mucha conexión con el estado "inactivo" – Allende

Cuestiones relacionadas