c# - pudo - Cómo resolver el error de grupo de conexiones máximo
no se pudo establecer conexion con la base de datos (4)
Antes de comenzar a maldecir tu aplicación, necesitas verificar esto:
¿Es tu aplicación la única que usa esa instancia de SQL Server? a. Si la respuesta es NO, entonces necesita investigar cómo las otras aplicaciones consumen recursos en su SQl Server.run b. Si la respuesta es sí, entonces debes investigar tu solicitud.
Ejecute el Analizador de SQL Server y verifique qué actividad está ocurriendo en otras aplicaciones (1a) utilizando SQL Server y verifique también su aplicación (1b).
Si, de hecho, su aplicación carece de recursos, deberá realizar investigaciones adicionales. Para más información, lea este http://sqlserverplanet.com/troubleshooting/sql-server-slowness
Tengo una aplicación en asp.net 3.5 y la base de datos es Sql server 2005.
"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."
Algún tiempo se produjo este error Cómo resolver este error ...
Intento SqlConnection.ClearAllPools();
Pero esto tampoco funciona.
SqlCommand cmdToExecute = new SqlCommand();
cmdToExecute.CommandText = "dbo.[sp_user_listing]";
cmdToExecute.CommandType = CommandType.StoredProcedure;
DataTable toReturn = new DataTable("courier_user_listing");
SqlDataAdapter adapter = new SqlDataAdapter(cmdToExecute);
// Use base class'' connection object
cmdToExecute.Connection = sqMainConnection;
try
{
cmdToExecute.Parameters.Add(new SqlParameter("@suser_name", SqlDbType.VarChar, 250, ParameterDirection.Input, true, 0, 0, "", DataRowVersion.Proposed, _user_name));
if (blnMainConnectionIsCreatedLocal)
{
// Open connection.
sqMainConnection.Open();
}
else
{
if (CPMainConnectionProvider.IsTransactionPending)
{
cmdToExecute.Transaction = CPMainConnectionProvider.CurrentTransaction;
}
}
// Execute query.
adapter.Fill(toReturn);
i32ErrorCode = (Int32)cmdToExecute.Parameters["@iErrorCode"].Value;
if (i32ErrorCode != (int)LLBLError.AllOk)
{
// Throw error.
throw new Exception("Stored Procedure ''sp_courier_user_SelectAll'' reported the ErrorCode: " + i32ErrorCode);
}
return toReturn;
}
catch (Exception ex)
{
// some error occured. Bubble it to caller and encapsulate Exception object
throw new Exception("Courier_user::SelectAll::Error occured.", ex);
}
finally
{
if (blnMainConnectionIsCreatedLocal)
{
// Close connection.
sqMainConnection.Close();
}
cmdToExecute.Dispose();
adapter.Dispose();
}
Compruebe contra cualquier consulta de larga duración en su base de datos.
Aumentar el tamaño de su grupo solo hará que su aplicación web viva un poco más (y probablemente se haga mucho más lenta)
Puede usar el generador de perfiles del servidor SQL y filtrar por duración / lecturas para ver qué consultas necesitan optimización.
También veo que probablemente estás manteniendo una conexión global?
blnMainConnectionIsCreatedLocal
Deje que .net haga la agrupación por usted y abra / cierre su conexión con una instrucción using.
Sugerencias:
Siempre abra y cierre una conexión como esta, para que .net pueda administrar sus conexiones y no se quede sin conexiones:
using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); // do some stuff } //conn disposed
Como mencioné, revise su consulta con el generador de perfiles de servidor SQL y vea si puede optimizarlo. Tener una consulta lenta con muchas solicitudes en una aplicación web también puede dar estos tiempos de espera.
Es posible que se trate de un problema de apertura múltiple de todas las conexiones, está en algún lugar del código que abre las conexiones y no las está cerrando correctamente. utilizar
using (SqlConnection con = new SqlConnection(connectionString))
{
con.Open();
}
Consulte este artículo: http://msdn.microsoft.com/en-us/library/ms254507(v=vs.80).aspx , el bloque Using en Visual Basic o C # elimina automáticamente la conexión cuando el código sale del bloque , incluso en el caso de una excepción no manejada.
Esto es lo que también puedes probar ...
ejecute su aplicación ... mientras se está ejecutando, inicie el símbolo del sistema
mientras su aplicación se ejecuta, escriba netstat -n en el símbolo del sistema. Debería ver una lista de conexiones TCP / IP. Compruebe si su lista no es muy larga. Lo ideal es tener menos de 5 conexiones en la lista. Compruebe el estado de las conexiones.
Si tiene demasiadas conexiones con un estado TIME_WAIT, significa que la conexión se ha cerrado y está esperando a que el sistema operativo libere los recursos. Si está ejecutando en Windows, el rango de puerto efímero predeterminado está entre 1024 y 5000 y el tiempo predeterminado que tarda Windows en liberar el recurso desde el estado de TIME_WAIT es de 4 minutos. Entonces, si su aplicación usó más de 3976 conexiones en menos de 4 minutos, obtendrá la excepción que obtuvo.
Sugerencias para solucionarlo:
- Agregue un grupo de conexiones a su cadena de conexión.
Si continúa recibiendo el mismo mensaje de error (que es altamente improbable), puede intentar lo siguiente: (No lo haga si no está familiarizado con el registro de Windows)
- Ejecute regedit desde su comando de ejecución. En el editor de registro, busque esta clave de registro: HKEY_LOCAL_MACHINE / SYSTEM / CurrentControlSet / Services / Tcpip / Parameters:
Modifica los ajustes para que lean:
MaxUserPort = dword: 00004e20 (10,000 decimal) TcpTimedWaitDelay = dword: 0000001e (30 decimal)
Esto aumentará la cantidad de puertos a 10,000 y reducirá el tiempo para liberar conexiones tcp / ip liberadas.
Solo usa la sugerencia 2 si 1 falla.
Gracias.