Conjunto máximo de conexões limitado a 100

27

Estou executando o SQL Server 2008 R2 SP1, em uma caixa do Windows Server 2008. Eu tenho um script .NET em execução no Visual Studio 2010 que faz o seguinte:

  • Chega ao banco de dados
  • Faz uma mudança
  • Iterates

O número total de vezes que iterará é 150, no entanto, ele está parando em 100 conexões e não consigo descobrir o porquê. Eu poderia ajustar meu script para usar apenas um único thread, mas prefiro saber onde estou perdendo uma configuração de conexão máxima, pois será mais útil saber para referência futura.

Aqui é onde eu verifiquei até agora:

  • String de conexão SQL no Visual Studio 2010 (está definido como 1000)
  • Propriedades de conexão da instância do banco de dados SSMS (é definido como 0 [infinito] conexões de usuário)
  • Pesquisou algumas informações no Server 2008, parece que ele pode lidar com mais de 100 conexões
  • Percorreu meu código ao lado, o SP_WHO2qual fornece mais informações sobre conexões lógicas, visto que o número de conexões começa em 52 e os erros de script com o erro "Máximo de conexões em pool atingidas" em 152 conexões lógicas.
  • Alterada a cadeia de conexão a ser usada Data Source=PerfSQL02;Initial Catalog=Masked;Integrated Security=True;Max Pool Size=1000

Não tenho certeza de onde mais verificar, sei que tenho muitas partes móveis aqui, mas estou com a sensação de que estou perdendo uma configuração máxima de piscina em algum lugar.

Sean Long
fonte
11
Você pode postar sua string de conexão? Por favor, veja minha resposta. Esse deve ser o seu remédio (esse valor será especificado na cadeia de conexão. O System.Data.SqlClientpadrão é 100, e é por isso que você vê a exaustão do conjunto de conexões).
Thomas Stringer

Respostas:

24

O SQL Server permite no máximo 32767 conexões por padrão. Pode ser alterado usando sp_configure. Para visualizar sua configuração atual para esta configuração, use a seguinte consulta:

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

Por padrão, você deve ver no máximo 32767, value_in_useigual a 0 (use as configurações padrão). Se isso tiver sido alterado, você poderá reconfigurar o SQL Server para usar outros valores, conforme descrito no link.

Você também deve revisar quantas conexões estão realmente sendo feitas, pois pode haver mais atividade fora do seu aplicativo (ou seu aplicativo está fazendo mais conexões do que você imagina). Você deseja consultar Estatísticas Gerais -> Conexões Lógicas no perfmon ou consultar os valores em sys.dm_os_performance_counters(cntr_value mostrará o valor atual do ponto no tempo):

select * from sys.dm_os_performance_counters
where counter_name ='User Connections'
Mike Fal
fonte
Sim, eu já verifiquei as conexões do usuário (foi a primeira coisa que fiz e é a mais fácil de encontrar na interface do usuário e na documentação da Microsoft. Também passei pelo meu código e fiquei de olho no número de conexões lógicas via SSMS por usando SP_WHO2, que fornece uma quantidade razoável de informações sobre as conexões lógicas. Em modo inativo, meu servidor tem 51 conexões. Quando o script falha, ele cria mais 100 conexões. É assim que cheguei onde estou agora.
Sean Long
Esclarei minha pergunta um pouco mais com as etapas que eu tomei. Pode não ser uma configuração no SQL, e foi por isso que comecei a examinar as configurações do Windows e do Visual Studio.
Sean Long
11
Se você verificou tudo isso e ainda falha em 100 conexões, a resposta está fora das configurações do banco de dados. Para sua informação, essas 51 conexões são todos os processos do sistema (+1 para você).
Mike Fal
Apenas para fornecer um fechamento, esse último comentário acabou sendo correto. Examinei mais detalhadamente por que essas 100 conexões estavam sendo criadas e encontrei um vazamento no código. Depois de corrigir isso funciona bem. As informações acima ainda são todas realmente úteis, e espero que outras pessoas também as considerem úteis.
Sean Long
25

Na sua cadeia de conexão, especifique max pool size=<your desired max pool size>. Portanto, em outras palavras, se você deseja alterar o tamanho máximo do pool para o valor 500, sua cadeia de conexão pode se parecer com isso:

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

Obviamente, estou assumindo muito com seus outros parâmetros, mas isso deve lhe dar uma boa idéia de como proceder. O pool de conexões é imposição do provedor do lado do cliente. É o cliente que precisará especificar essa configuração de tamanho máximo do pool, por meio da cadeia de conexão.

Além disso, verifique se você está fechando ou descartando suas conexões corretamente, caso contrário, amarre as conexões. Algo assim (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
    }
}

O usingbloco (em C #) chama IDisposable.Dispose()após a conclusão. Você também pode implementar SqlConnection.Dispose()ou SqlConnection.Close()no finallybloco de um try/catch/finallybloco.

Referência: documentação do MSDN na propriedade SqlConnection.ConnectionString

Thomas Stringer
fonte
Aqui está a string de conexão, atualizando minha pergunta também. Data Source=PerfSQL02;Initial Catalog=Masked;Integrated Security=True;Max Pool Size=1000
Sean Long
3
Essa é a sua conexão em toda parte ? A razão pela qual pergunto é porque cadeias de conexão diferentes serão conjuntos de conexões diferentes.
Thomas Stringer
Essa é uma pergunta muito, muito boa. Eu verifiquei três cadeias de conexão até agora, mas todas estão pressionando por um pool máximo alto. Vou ver se consigo encontrar outra string que possa causar isso.
Sean Long
Se você apenas depurar a execução, poderá verificar qual é o valor de tempo de execução SqlConnection.ConnectionStringpara a operação específica. Essa seria a maneira mais fácil. Se max pool sizenão estiver lá, são 100 então.
Thomas Stringer
11
Isso deve ser marcado como a resposta aceita, pois na verdade responde corretamente ao OP. Ele menciona o parâmetro Max Pool Size da string de conexão do cliente e a necessidade de fechar / descartar conexões.
quer