Piscina de conexión máxima limitada a 100

27

Estoy ejecutando SQL Server 2008 R2 SP1, en un cuadro de Windows Server 2008. Tengo un script .NET que se ejecuta desde Visual Studio 2010 que hace lo siguiente:

  • Llega a la base de datos.
  • Hace un cambio
  • Iterates

El número total de veces que iterará es 150, sin embargo, se detiene en 100 conexiones y no puedo entender por qué. Podría ajustar mi script para usar un solo hilo, pero preferiría saber dónde me falta una configuración de conexión máxima, ya que será más útil saberlo para futuras referencias.

Aquí es donde he comprobado hasta ahora:

  • Cadena de conexión SQL en Visual Studio 2010 (se establece en 1000)
  • Propiedades de conexión de la instancia de la base de datos SSMS (se establece en 0 [infinito] conexiones de usuario)
  • Busqué en Google alguna información sobre Server 2008, parece que puede manejar más de 100 conexiones
  • Revisé mi código junto con el SP_WHO2que proporciona más información sobre las conexiones lógicas, al ver que el número de conexiones comienza en 52 y los errores de script con el error "Se han alcanzado las conexiones agrupadas máximas" en 152 conexiones lógicas.
  • Cambió la cadena de conexión para usar Data Source=PerfSQL02;Initial Catalog=Masked;Integrated Security=True;Max Pool Size=1000

No estoy seguro de dónde más verificar, sé que tengo muchas partes móviles aquí, pero tengo la sensación de que me falta una configuración máxima de la piscina en alguna parte.

Sean Long
fuente
1
¿Puedes publicar tu cadena de conexión? Por favor mira mi respuesta. Ese debería ser su remedio (este valor se especificará en la cadena de conexión. El valor System.Data.SqlClientpredeterminado es 100, por lo que verá el agotamiento del grupo de conexiones).
Thomas Stringer

Respuestas:

24

SQL Server permite un máximo de 32767 conexiones de forma predeterminada. Se puede modificar usando sp_configure. Para ver su configuración actual para esta configuración, use la siguiente consulta:

select * from sys.configurations
where name ='user connections'

De forma predeterminada, debería ver un máximo de 32767, value_in_useigual a 0 (use la configuración predeterminada). Si esto se ha modificado, puede volver a configurar SQL Server para usar otros valores como se describe en el enlace.

También debe revisar cuántas conexiones se están haciendo realmente , ya que podría haber más actividad fuera de su aplicación (o su aplicación está haciendo más conexiones de las que cree). Deberá consultar Estadísticas generales -> Conexiones lógicas en perfmon o consultar los valores en sys.dm_os_performance_counters(cntr_value mostrará el valor actual del punto en el tiempo):

select * from sys.dm_os_performance_counters
where counter_name ='User Connections'
Mike Fal
fuente
Sí, ya verifiqué las conexiones de los usuarios (es lo primero que hice, y es la más fácil de encontrar tanto en la interfaz de usuario como en la documentación de Microsoft. También revisé mi código y vigilé la cantidad de conexiones lógicas a través de SSMS por usando SP_WHO2, que proporciona una cantidad decente de información sobre las conexiones lógicas. En espera, mi servidor tiene 51 conexiones. Cuando falla el script, ha construido 100 conexiones más. Así es como llegué a donde estoy ahora.
Sean Long
Aclaré mi pregunta un poco más con los pasos que he tomado. Es posible que no sea una configuración en SQL, por lo que comencé a buscar la configuración de Windows y Visual Studio.
Sean Long
1
Si ha verificado todo eso y aún falla en 100 conexiones, la respuesta se encuentra fuera de la configuración de la base de datos. Para su información, esas 51 conexiones son todos los procesos del sistema (+1 para usted).
Mike Fal
Solo para proporcionar un cierre, ese último comentario terminó siendo correcto. Eché un vistazo más de cerca a por qué esas 100 conexiones se estaban creando y encontré una fuga en el código. Después de arreglar eso funciona bien. Sin embargo, la información anterior sigue siendo realmente útil, y espero que otros también la encuentren útil.
Sean Long
25

En su cadena de conexión, especifique max pool size=<your desired max pool size>. En otras palabras, si desea cambiar el tamaño máximo de la agrupación al valor 500, su cadena de conexión podría parecerse a esto:

"data source=your_server; initial catalog=your_db; trusted_connection=true; max pool size=500"

Obviamente estoy asumiendo mucho con sus otros parámetros, pero esto debería darle una buena idea de cómo proceder. La agrupación de conexiones es la aplicación del proveedor del lado del cliente. Es el cliente el que deberá especificar esta configuración de tamaño máximo de grupo, a través de la cadena de conexión.

Además, asegúrese de cerrar o deshacerse de sus conexiones correctamente, de lo contrario, atará las conexiones. Algo como esto (C #):

string connectionString = "data source=your_server; initial catalog=your_db; trusted_connection=true; max pool size=500";

using (SqlConnection dbConn = new SqlConnection(connectionString))
{
    using (SqlCommand sqlCmd = new SqlCommand())
    {
        sqlCmd.Connection = dbConn;
        sqlCmd.CommandText = "select 1;";

        // ... so on and so forth
    }
}

El usingbloque (en C #) llama IDisposable.Dispose()al finalizar. También podría implementar SqlConnection.Dispose()o SqlConnection.Close()en el finallybloque de un try/catch/finallybloque.

Referencia: documentación de MSDN sobre la propiedad SqlConnection.ConnectionString

Thomas Stringer
fuente
Aquí está la cadena de conexión, actualizando mi pregunta también. Data Source=PerfSQL02;Initial Catalog=Masked;Integrated Security=True;Max Pool Size=1000
Sean Long
3
¿Es esa tu cadena de conexión en todas partes ? La razón por la que pregunto es porque diferentes cadenas de conexión van a ser diferentes grupos de conexión.
Thomas Stringer
Esa es una muy, muy buena pregunta. Revisé 3 cadenas de conexión hasta ahora, pero todas están presionando para obtener un grupo de alto máximo. Veré si puedo encontrar alguna otra cadena que pueda causarla.
Sean Long
Si solo depura la ejecución, debería poder ver cuál es el valor de tiempo de ejecución de SqlConnection.ConnectionStringla operación en particular. Esa sería la forma más fácil. Si max pool sizeno está allí, son 100 entonces.
Thomas Stringer
1
Esto debe marcarse como la respuesta aceptada, ya que en realidad responde el OP correctamente. Menciona tanto el parámetro Max Pool Size de la cadena de conexión del cliente como la necesidad de cerrar / eliminar conexiones.
Adam Caviness