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


Los últimos días vemos este mensaje de error en nuestro sitio web demasiado:

"El tiempo de espera ha expirado. El período de tiempo de espera transcurrido antes de obtener un conexión desde la piscina. Este mayo han ocurrido porque todos agrupados las conexiones estaban en uso y piscina máxima se alcanzó el tamaño."

No Hemos cambiado nada en nuestro código en un tiempo. Revisé el código para verificar las conexiones abiertas que no se cerraron, pero encontré que todo estaba bien.

  • ¿Cómo puedo resolver esto?

  • ¿Necesito editar este grupo?

  • ¿Cómo puedo editar el número máximo de conexiones de este grupo?

  • ¿Cuál es el valor recomendado para un sitio web de alto tráfico?


Actualización:

¿Necesito editar algo en IIS?

Actualización:

Encontré que el número de conexiones activas está entre 15 y 31, y encontré que el número máximo permitido de conexiones configuradas en SQL server es más que 3200 conexiones, es 31 demasiadas o debería editar algo en el ASP.NET ¿configuración?

Author: GEOCHET, 2009-03-22

17 answers

En la mayoría de los casos los problemas de agrupación de conexiones están relacionados con "fugas de conexión."Su aplicación probablemente no cierra sus conexiones de base de datos correcta y consistentemente. Cuando deja las conexiones abiertas, permanecen bloqueadas hasta que el recolector de basura de.NET las cierra por usted llamando a su método Finalize().

Desea asegurarse de que está realmente cerrando la conexión. Por ejemplo, el siguiente código causará 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 manera correcta sería esta: {[16]]}

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 almacenarla en caché localmente y llamar a su método Close. Filtrará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 la conexión, esta línea crea una nueva y trata de cerrar se.

Si usa SqlDataReader o un OleDbDataReader, ciérrelos. A pesar de que el cierre de la conexión en sí parece hacer el truco, poner en el esfuerzo adicional para cerrar sus objetos de lector de datos explícitamente cuando los utiliza.


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 en el sistema devuelven información del sysprocesses tabla del sistema que muestra el estado y la información sobre todos los procesos de trabajo. Generalmente, verá un ID de proceso del servidor (SPID) por conexión. Si nombró su conexión mediante el argumento Nombre de la aplicación en la cadena de conexión, sus conexiones de trabajo serán fáciles de encontrar.
  • Utilice SQL Server Profiler con la plantilla SQLProfiler TSQL_Replay para rastrear conexiones abiertas. Si está familiarizado con Profiler, este método es más fácil que el sondeo usando sp_who.
  • Utilice el Monitor de rendimiento para monitorizar los pools y las conexiones. Discuto este método en un momento.
  • Monitoree los contadores de rendimiento en código. Puede supervisar el estado de su grupo de conexiones y el número de conexiones establecidas utilizando rutinas para extraer los contadores o utilizando los nuevos controles PerformanceCounter de.NET.
 163
Author: splattne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-06 12:57:27

Al instalar.NET Framework v4.6.1, nuestras conexiones a una base de datos remota comenzaron inmediatamente a agotarse debido a este cambio.

Para arreglar simplemente agregue el parámetro TransparentNetworkIPResolution en la cadena de conexión y póngalo en false :

Server=myServerName;Database=myDataBase;Trusted_Connection=True;TransparentNetworkIPResolution=False

 24
Author: ajbeaven,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-10 11:49:58

A menos que su uso aumentara mucho, parece poco probable que solo haya un retraso en el trabajo. IMO, la opción más probable es que algo esté usando conexiones y no liberándolas rápidamente. ¿Estás seguro que estás usando using en todos los casos? O (a través de cualquier mecanismo) liberando las conexiones?

 12
Author: Marc Gravell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-22 09:58:39

¿Ha comprobado los DataReaders que no están cerrados y la respuesta?redirige antes de cerrar la conexión o un datareader. Las conexiones permanecen abiertas cuando no las cierras antes de una redirección.

 11
Author: Ivo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-22 10:05:28

También encontramos este problema de vez en cuando en nuestro sitio web. El culpable en nuestro caso, es que nuestras estadísticas / índices están desactualizados. Esto hace que una consulta que anteriormente se ejecutaba rápidamente (eventualmente) se vuelva lenta y se agote el tiempo.

Intente actualizar las estadísticas y/o reconstruir los índices en las tablas afectadas por la consulta y vea si eso ayuda.

 9
Author: Alex Czarto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-14 22:51:42

Puede especificar el tamaño mínimo y máximo del grupo especificando MinPoolSize=xyz y/o MaxPoolSize=xyz en la cadena de conexión. Esta causa del problema podría ser una cosa diferente sin embargo.

 5
Author: Mehrdad Afshari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-22 09:53:55

También me he encontrado con este problema, al usar una capa de datos de terceros en una de mis aplicaciones.NET. El problema era que la capa no cerraba las conexiones correctamente.

Tiramos la capa y creamos una nosotros mismos, que siempre cierra y dispone las conexiones. Desde entonces ya no recibimos el error.

 5
Author: Wim Haanstra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-22 10:50:46

Si está trabajando en código heredado complejo donde un uso simple(..) {..} no es posible-como lo era yo-es posible que desee revisar el fragmento de código que publiqué en este ASÍ que pregunta para una forma de determinar la pila de llamadas de la creación de la conexión cuando una conexión se filtra potencialmente (no se cierra después de un tiempo de espera establecido). Esto hace que sea bastante fácil detectar la causa de las fugas.

 2
Author: LOAS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:10:33

Esto se debe principalmente a que la conexión no se ha cerrado en la aplicación. Utilice "minPoolSize" y "maxPoolSize" en la cadena de conexión.

 2
Author: subramanian.m,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-31 05:57:59

En mi caso, no estaba cerrando el objeto DataReader.

        using (SqlCommand dbCmd = new SqlCommand("*StoredProcedureName*"))
        using (dbCmd.Connection = new SqlConnection(WebConfigurationAccess.ConnectionString))
            {
            dbCmd.CommandType = CommandType.StoredProcedure;

            //Add parametres
            dbCmd.Parameters.Add(new SqlParameter("@ID", SqlDbType.Int)).Value = ID;
.....
.....
            dbCmd.Connection.Open();
            var dr = dbCmd.ExecuteReader(); //created a Data reader here
            dr.Close();    //gotta close the data reader
            //dbCmd.Connection.Close(); //don't need this as 'using' statement should take care of this in its implicit dispose method.
            }
 2
Author: DevelopZen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-24 15:31:37

No instancies la conexión sql demasiadas veces. Abra una o dos conexiones y utilícelas para todas las operaciones sql siguientes.

Parece que incluso cuando Dispose ing las conexiones se lanza la excepción.

 2
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-13 10:39:08

Usa esto:

finally
{
    connection.Close();
    connection.Dispose();
    SqlConnection.ClearPool();
}
 2
Author: Jeno M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-18 10:50:18

Puedes probar eso también, para resolver el problema de tiempo de espera:

Si no agregaste httpRuntime a tu webconfig, añádelo en <system.web> tag

<sytem.web>
     <httpRuntime maxRequestLength="20000" executionTimeout="999999"/>
</system.web>

Y

Modifica tu cadena de conexión de esta manera;

 <add name="connstring" connectionString="Data Source=DSourceName;Initial Catalog=DBName;Integrated Security=True;Max Pool Size=50000;Pooling=True;" providerName="System.Data.SqlClient" />

En el último uso

    try
    {...} 
    catch
    {...} 
    finaly
    {
     connection.close();
    }
 2
Author: Ka_Ya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-02 14:37:14

Este problema que tenía en mi código. Voy a pegar un código de ejemplo que tengo más vino por debajo de error. El tiempo de espera transcurrido antes de obtener una conexión del pool. Esto puede haber ocurrido porque todas las conexiones agrupadas estaban en uso y se alcanzó el tamaño máximo del grupo.

 String query = "insert into STATION2(ID,CITY,STATE,LAT_N,LONG_W) values('" + a1 + "','" + b1 + "','" + c1 + "','" + d1 + "','" + f1 + "')";
    //,'" + d1 + "','" + f1 + "','" + g1 + "'

    SqlConnection con = new SqlConnection(mycon);
    con.Open();
    SqlCommand cmd = new SqlCommand();
    cmd.CommandText = query;
    cmd.Connection = con;
    cmd.ExecuteNonQuery();
    **con.Close();**

Desea cerrar la conexión cada vez. Antes de que yo no nos la conexión cercana debido a esto tengo error. Después de agregar la instrucción close he superado este error

 1
Author: Aravindhan R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-18 11:41:30

Además de las soluciones publicadas....

Al tratar con 1000 páginas de código heredado, cada una llamando a un GETR común varias veces, aquí hay otra forma de solucionar el problema:

En una DLL común existente, agregamos el CommandBehavior.CloseConnection opción:

    static public IDataReader GetRS(String Sql)
    {
        SqlConnection dbconn = new SqlConnection(DB.GetDBConn());
        dbconn.Open();
        SqlCommand cmd = new SqlCommand(Sql, dbconn);
        return cmd.ExecuteReader(CommandBehavior.CloseConnection);   
    }

Luego, en cada página, siempre y cuando cierre el lector de datos, la conexión también se cerrará automáticamente para evitar fugas de conexión.

    IDataReader rs = CommonDLL.GetRS("select * from table");
    while (rs.Read())
    {
        // do something
    }
    rs.Close();   // this also closes the connection
 1
Author: David Nelson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-31 05:32:46

Ha filtrado conexiones en su código. Puede intentar usar usar para certificar que los está cerrando.

 Using (SqlConnection sqlconnection1 = new SqlConnection(“Server=.\\SQLEXPRESS ;Integrated security=sspi;connection timeout=5”)) {
                          sqlconnection1.Open();
                          SqlCommand sqlcommand1 = sqlconnection1.CreateCommand();
                          sqlcommand1.CommandText = “raiserror (‘This is a fake exception’, 17,1)”;
                          sqlcommand1.ExecuteNonQuery();  //this throws a SqlException every time it is called.
                          sqlconnection1.Close(); //Still never gets called.
              } // Here sqlconnection1.Dispose is _guaranteed_

Https://blogs.msdn.microsoft.com/angelsb/2004/08/25/connection-pooling-and-the-timeout-expired-exception-faq/

 0
Author: EduLopez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-15 13:14:35

Este problema me he encontrado antes. Terminó siendo un problema con el firewall. Acabo de añadir una regla al firewall. Tuve que abrir port 1433 para que el servidor SQL se pueda conectar al servidor.

 0
Author: Feisal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-05 20:37:50