sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo puedo resolver un problema de grupo de conexiones entre ASP.NET y SQL Server?

En la mayoría de los casos, los problemas de agrupación de conexiones están relacionados con pérdidas de conexión . Es probable que su aplicación no cierre sus conexiones de base de datos de manera correcta y consistente. Cuando deja abiertas las conexiones, permanecen bloqueadas hasta que el recolector de elementos no utilizados de .NET las cierra llamando a su Finalize() método.

Quiere asegurarse de que está realmente cerrando la conexión . Por ejemplo, el siguiente código provocará una fuga de conexión, si el código entre .Open y Close lanza 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 almacenarlo en caché localmente y llame a su Close método. Perderás 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 un OleDbDataReader , cerrarlos. Aunque cerrar la conexión en sí parece funcionar, 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:

  • Ejecutar sp_who o sp_who2 . Estos procedimientos almacenados del sistema devuelven información de los sysprocesses tabla del sistema que muestra el estado y la información sobre todos los procesos de trabajo. Por lo general, verá un ID de proceso de servidor (SPID) por conexión. Si nombró su conexión usando el argumento Nombre de la aplicación en la cadena de conexión, sus conexiones de trabajo serán fáciles de encontrar.
  • Usar SQL Server Profiler con SQLProfiler TSQL_Replay plantilla para rastrear conexiones abiertas. Si está familiarizado con Profiler, este método es más fácil que sondear usando sp_who.
  • Utilice el Monitor de rendimiento para monitorear los grupos y las conexiones. Discutiré este método en un momento.
  • Supervise los contadores de rendimiento en el código. Puede monitorear el estado de su grupo de conexiones y la cantidad de conexiones establecidas usando rutinas para extraer los contadores o usando los nuevos controles .NET PerformanceCounter.