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
y Close
arroja 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 Close
mé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 SqlDataReader
o 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_who
o sp_who2
. Estos procedimientos almacenados del sistema devuelven información de la sysprocesses
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.
- Use SQL Server Profiler con la
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.
- 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.