2011-07-06 11 views
10

Tengo un problema en el código que he escrito usando .NET.Cómo encontrar lo que está usando las conexiones en mi grupo de conexiones

El problema es que en alguna parte tengo un código de base de datos poco fiables que significa que después de un tiempo me sale el siguiente error:

Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.

sé que es porque en algún lugar que no he dispuesto de una de mis lectores de datos o algo similar, lo que significa que todavía tiene la conexión abierta por lo que no se devuelve al grupo. Sin embargo, tengo un problema para encontrar dónde está pasando esto en mi código.

Así que mi pregunta:

¿Hay alguna forma de consultar la agrupación de conexiones para averiguar lo que su uso en conexiones están haciendo. Solo busco una forma de encontrar qué consulta se está ejecutando para permitirme encontrar la pieza ofensiva del código.

Por lo que vale no tengo permisos para ejecutar un monitor de actividad en la base de datos en cuestión para descubrir de esa manera.

+0

¿qué versión de Framework está utilizando? –

+0

@Conrad: Versión 2.0 – Chris

Respuesta

12

Is there any way to query the connection pool to find out what its in use connections are doing.

No. Realmente no. El grupo de conexiones es algo que su aplicación mantiene (en realidad, un List<DbConnectionInternal>). Si realmente deseaba, podía acceder a las conexiones del grupo mediante reflexión o si estaba depurando, a través de una ventana local o de observación (consulte a continuación), pero puede Llegue a lo que está sucediendo en esa conexión desde allí o qué objeto debería haber llamado Conexión.Cierre (o Deseche). Así que eso no ayuda

enter image description here

Si tiene suerte puede ejecutar sp_who o sp_who2 en el momento en que se obtiene el tiempo de espera cuando se han acabado las conexiones agrupadas cuando pero su muy probable que la mayoría de los resultados se verán así.

SPID Staus Login Hostname Blkby DBname Command   .... 
---- ------- ----- --------- ----- ------ ---------------- 
79 sleeping uName WebServer .  YourDb AWAITING COMMAND ..... 
80 sleeping uName WebServer .  YourDb AWAITING COMMAND ..... 
81 sleeping uName WebServer .  YourDb AWAITING COMMAND ..... 
82 sleeping uName WebServer .  YourDb AWAITING COMMAND ..... 

Lo que significa que sí, de hecho, su aplicación ha abierto una gran cantidad de conexiones y no las cerró y ni siquiera está haciendo nada con ellas.

La mejor manera de combatir esto es perfilando su aplicación use el ADO.NET Performance Counters y observe de cerca NumberOfReclaimedConnections y también haga una revisión minuciosa del código.

Si está realmente desesperado puede Borrar el grupo cuando se encuentre con este problema.

using (SqlConnection cnn = new SqlConnection("YourCnnString")) 
{ 

    try 
    { 
      cnn.Open(); 
    } 
    catch (InvalidOperationException) 
    { 
      SqlConnection.ClearPool(cnn); 
    } 
    cnn.Open(); 

} 

Yo sin embargo advertir contra esto porque tiene el potencial de asfixia su servidor de base de datos, ya que permite su aplicación para abrir tantas conexiones como el servidor permitirá antes de que simplemente se queda sin recursos.

+0

Gracias, Conrad. Parece una respuesta bastante completa y dijo lo que sospechaba. Al final, decidí que no estaba contento con la forma en que se había escrito el acceso a la base de datos y terminé por reorganizarlo por completo, pero esto es útil para el futuro, especialmente los indicadores sobre cómo encontrar el grupo de conexiones en la ventana del reloj. :) – Chris

2

¿Ha intentado cargar SSMS y ejecutar sp_who2 en la base de datos en cuestión?

USE [SomeDatabase] 
EXEC sp_who2 

Eso debería mostrarle lo que sucede en un momento determinado.

+0

Acabo de probarlo (sp_who2 si quiere corregir su error tipográfico) pero solo devolvió mi conexión actual.Traté de cambiar mi conexión para usar la misma configuración de conexión que el código en cuestión, pero aún así solo se mostró mi fila, que parecía ser mi conexión actual. Supongo que este es el mismo problema de permisos que me impide ejecutar el monitor de actividad. :(Gracias por la sugerencia. – Chris

Cuestiones relacionadas