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 .Openy Closearroja una excepción:
var connection = new SqlConnection(connectionString);
connection.Open();
// some code
connection.Close();
La forma correcta sería esta:
var connection = new SqlConnection(ConnectionString);
try
{
connection.Open();
someCall (connection);
}
finally
{
connection.Close();
}
o
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
someCall(connection);
}
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 Closemétodo. Perderá una conexión usando este código, por ejemplo:
var command = new OleDbCommand(someUpdateQuery, getConnection());
result = command.ExecuteNonQuery();
connection().Close();
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 SqlDataReadero a OleDbDataReader, 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:
- Corre
sp_whoo sp_who2. Estos procedimientos almacenados del sistema devuelven información de la sysprocessestabla 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.
- Use SQL Server Profiler con la
TSQL_Replayplantilla SQLProfiler para rastrear conexiones abiertas. Si está familiarizado con Profiler, este método es más fácil que sondear utilizando sp_who.
- Use el Monitor de rendimiento para controlar los grupos y las conexiones. Discuto este método en un momento.
- Monitoree los contadores de rendimiento en el código. Puede supervisar el estado de su grupo de conexiones y la cantidad de conexiones establecidas mediante el uso de rutinas para extraer los contadores o mediante los nuevos controles .NET PerformanceCounter.