Tempo limite de conexão para servidor SQL


109

Posso aumentar o tempo limite modificando a string de conexão no web.config?


7
Não leia isso como eu fiz, pensando que o tempo limite controlaria a execução da consulta - ele não controla, apenas o tempo limite para se conectar ao servidor - "tempo limite de conexão" seria um nome melhor. Consulte stackoverflow.com/a/7976867/409856
downwitch

Respostas:


213

Sim, você pode acrescentar ;Connection Timeout=30à sua string de conexão e especificar o valor que desejar.

O valor de tempo limite definido na Connection Timeoutpropriedade é um tempo expresso em segundos . Se esta propriedade não for configurada, o valor do tempo limite da conexão é o valor padrão (15 segundos).

Além disso, definindo o valor de tempo limite para 0, você está especificando que sua tentativa de conexão aguarda um tempo infinito. Conforme descrito na documentação, isso é algo que você não deve definir em sua string de conexão:

Um valor de 0 indica que não há limite e deve ser evitado em um ConnectionString porque uma tentativa de conexão espera indefinidamente.


Você pode dar um exemplo disso? Estou usando EF6 e tenho 3 milhões de dados em minha tabela quando algum programa de processo retorna um erro de tempo limite ... observação: estou usando indexação na tabela
saulyasar

4
@saulyasar Este é o tempo limite de CONNECTION, não o tempo limite de COMMAND. O tempo limite de CONEXÃO é sobre quanto tempo ele tentará se CONECTAR ao servidor sql. Você deseja investigar o tempo limite de COMMAND, que é quanto tempo um procedimento ou instrução será executado antes de atingir o tempo limite.
granadaCoder

32

Hmmm ...

Como disse Darin, você pode especificar um valor de tempo limite de conexão mais alto, mas duvido que esse seja realmente o problema.

Quando você obtém tempos limite de conexão, normalmente é um problema com um dos seguintes:

  1. Configuração de rede - conexão lenta entre seu servidor web / dev box e o servidor SQL. Aumentar o tempo limite pode corrigir isso, mas convém investigar o problema subjacente.

  2. String de conexão. Tenho visto problemas em que um nome de usuário / senha incorretos, por algum motivo, fornecem um erro de tempo limite em vez de um erro real indicando "acesso negado". Isso não deveria acontecer, mas a vida é assim.

  3. String de conexão 2: se você estiver especificando o nome do servidor incorretamente ou de forma incompleta (por exemplo, em mysqlservervez de mysqlserver.webdomain.com), você obterá um tempo limite. Você pode executar ping no servidor usando o nome do servidor exatamente como especificado na string de conexão da linha de comando?

  4. Sequência de conexão 3: Se o nome do servidor estiver em seu DNS (ou arquivo hosts), mas apontar para um IP incorreto ou inacessível, você obterá um tempo limite em vez de um erro de máquina não encontrada.

  5. A consulta que você está chamando está expirando. Pode parecer que a conexão com o servidor é o problema, mas, dependendo de como seu aplicativo está estruturado, você pode estar indo até o estágio em que sua consulta está sendo executada antes que o tempo limite ocorra.

  6. Vazamentos de conexão. Quantos processos estão em execução? Quantas conexões abertas? Não tenho certeza se o ADO.NET bruto realiza o pool de conexão, fecha automaticamente as conexões quando necessário, como a Enterprise Library, ou onde tudo está configurado. Este é provavelmente um arenque vermelho. Ao trabalhar com WCF e serviços da Web, porém, tive problemas com conexões não fechadas que causavam tempos limite e outros comportamentos imprevisíveis.

Coisas para tentar:

  1. Você obtém um tempo limite ao se conectar ao servidor com o SQL Management Studio? Em caso afirmativo, a configuração de rede é provavelmente o problema. Se você não encontrar um problema ao se conectar com o Management Studio, o problema estará no seu aplicativo, não no servidor.

  2. Execute o SQL Profiler e veja o que está realmente acontecendo na rede. Você deve saber se está realmente se conectando ou se o problema é uma consulta.

  3. Execute sua consulta no Management Studio e veja quanto tempo leva.

Boa sorte!


Se a sua consulta está
expirando

@ user55474 provavelmente; depende ( muito raramente) de como está sendo chamado.
3Dave

Não de acordo com esta postagem do blog do
msdn

@hugh acho que disse que era raro, mas vi em primeira mão.
3Dave de

1
1 para "Executar SQL Profiler". Parece que vai ser complicado, mas na verdade basta clicar em "Ferramentas> SQL Server Profiler" e observar o que seu aplicativo está dizendo ao SQL Server. Acontece que a minha era a Opção # 5 :)
Andrew Kvochick

11

Se você quiser alterá-lo dinamicamente, prefiro usar SqlConnectionStringBuilder .

Ele permite que você converta ConnectionString, ou seja, uma string em uma classe Object. Todas as propriedades da string de conexão se tornarão seu membro.

Nesse caso, a vantagem real seria que você não precisa se preocupar. Se a parte da string ConnectionTimeout já existe na string de conexão ou não?

Além disso, como ele cria um objeto e é sempre bom atribuir valor no objeto ao invés de manipular string.

Aqui está o exemplo de código:

var sscsb = new SqlConnectionStringBuilder(_dbFactory.Database.ConnectionString);

sscsb.ConnectTimeout = 30;

var conn = new SqlConnection(sscsb.ConnectionString);

2
Eu não posso acreditar que tornar a ConnectionTimeoutpropriedade do SqlConnectiontipo somente leitura foi considerada uma boa ideia.
Maslow
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.