Délai d'expiration de la connexion pour le serveur SQL

109

Puis-je augmenter le délai en modifiant la chaîne de connexion dans le web.config?

Zachary
la source
7
Ne lisez pas ceci comme je l'ai fait en pensant que le timeout contrôlerait l'exécution de la requête - ce n'est pas le cas, seulement le timeout pour se connecter au serveur - "connection timeout" serait un meilleur nom. Voir stackoverflow.com/a/7976867/409856
downwitch

Réponses:

213

Oui, vous pouvez ajouter ;Connection Timeout=30à votre chaîne de connexion et spécifier la valeur que vous souhaitez.

La valeur de délai d'expiration définie dans la Connection Timeoutpropriété est une durée exprimée en secondes . Si cette propriété n'est pas définie, la valeur du délai d'expiration de la connexion est la valeur par défaut (15 secondes).

De plus, en définissant la valeur du délai d'expiration sur 0, vous spécifiez que votre tentative de connexion attend un temps infini. Comme décrit dans la documentation, c'est quelque chose que vous ne devez pas définir dans votre chaîne de connexion:

Une valeur de 0 indique aucune limite et doit être évitée dans une ConnectionString car une tentative de connexion attend indéfiniment.

Darin Dimitrov
la source
Pouvez-vous en donner un exemple? J'utilise EF6 et j'ai 3 millions de données dans ma table lorsque je fais un programme de traitement renvoie une erreur de délai d'expiration ... Remarque:
j'utilise l'
4
@saulyasar Il s'agit du délai de CONNEXION, pas du délai de COMMANDE. Le délai de CONNEXION correspond à la durée pendant laquelle il essaiera de se connecter au serveur SQL. Vous souhaitez examiner le délai d'expiration COMMAND, qui correspond à la durée pendant laquelle une procédure ou une instruction s'exécutera avant l'expiration du délai.
granadaCoder
32

Hmmm ...

Comme Darin l'a dit, vous pouvez spécifier une valeur de délai d'expiration de connexion plus élevée, mais je doute que ce soit vraiment le problème.

Lorsque vous obtenez des délais de connexion, il s'agit généralement d'un problème lié à l'un des éléments suivants:

  1. Configuration réseau - connexion lente entre votre serveur Web / boîte de développement et le serveur SQL. L'augmentation du délai d'expiration peut corriger cela, mais il serait sage d'étudier le problème sous-jacent.

  2. Chaîne de connexion. J'ai vu des problèmes où un nom d'utilisateur / mot de passe incorrect, pour une raison quelconque, donnera une erreur de temporisation au lieu d'une erreur réelle indiquant «accès refusé». Cela ne devrait pas arriver, mais telle est la vie.

  3. Chaîne de connexion 2: si vous spécifiez le nom du serveur de manière incorrecte ou incomplète (par exemple, mysqlserverau lieu de mysqlserver.webdomain.com), vous obtiendrez un délai d'expiration. Pouvez-vous envoyer une requête ping au serveur en utilisant le nom du serveur exactement comme spécifié dans la chaîne de connexion à partir de la ligne de commande?

  4. Chaîne de connexion 3: Si le nom du serveur est dans votre DNS (ou fichier hosts), mais qu'il pointe vers une adresse IP incorrecte ou inaccessible, vous obtiendrez un délai d'expiration plutôt qu'une erreur de machine introuvable.

  5. La requête que vous appelez arrive à expiration. Il peut sembler que la connexion au serveur soit le problème, mais, en fonction de la structure de votre application, vous pourriez vous rendre jusqu'au stade où votre requête s'exécute avant l'expiration du délai.

  6. Fuites de connexion. Combien de processus sont en cours d'exécution? Combien de connexions ouvertes? Je ne suis pas sûr si ADO.NET brut effectue le regroupement de connexions, ferme automatiquement les connexions lorsque cela est nécessaire dans la bibliothèque d'entreprise, ou où tout cela est configuré. C'est probablement un hareng rouge. Lorsque je travaille avec WCF et les services Web, cependant, j'ai eu des problèmes avec des connexions non fermées provoquant des délais d'expiration et d'autres comportements imprévisibles.

Choses à essayer:

  1. Obtenez-vous un délai d'expiration lors de la connexion au serveur avec SQL Management Studio? Si tel est le cas, la configuration du réseau est probablement le problème. Si vous ne voyez pas de problème lors de la connexion à Management Studio, le problème se trouvera dans votre application, pas avec le serveur.

  2. Exécutez SQL Profiler et voyez ce qui se passe réellement sur le fil. Vous devriez pouvoir dire si vous vous connectez vraiment ou si une requête est le problème.

  3. Exécutez votre requête dans Management Studio et voyez combien de temps cela prend.

Bonne chance!

3Dave
la source
si votre requête expire, je suppose que vous obtiendrez un délai de commande
user55474
@ user55474 probablement; dépend ( très rarement) de la manière dont il est appelé.
3Dave
Pas selon ce billet de blog msdn: blogs.msdn.com/b/spike/archive/2008/07/31/…
tom redfern
@hugh Je crois que j'ai dit que c'était rare, mais je l'ai vu de première main.
3Dave
1
+1 pour "Run SQL Profiler". Cela semble compliqué, mais il vous suffit de cliquer sur "Outils> SQL Server Profiler" et de regarder ce que votre application dit à SQL Server. Il s'avère que la mienne était l'option n ° 5 :)
Andrew Kvochick
11

Si vous souhaitez le modifier dynamiquement, je préfère utiliser SqlConnectionStringBuilder .

Il vous permet de convertir ConnectionString c'est-à-dire une chaîne en classe Object. Toutes les propriétés de la chaîne de connexion deviendront son membre.

Dans ce cas, le véritable avantage serait que vous n'avez pas à vous soucier de savoir si la partie de chaîne ConnectionTimeout existe déjà dans la chaîne de connexion ou non?

Aussi, car il crée un objet et il est toujours bon d'attribuer une valeur à l'objet plutôt que de manipuler une chaîne.

Voici l'exemple de code:

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

sscsb.ConnectTimeout = 30;

var conn = new SqlConnection(sscsb.ConnectionString);
Imran Rizvi
la source
2
Je ne peux pas croire que rendre la ConnectionTimeoutpropriété sur le SqlConnectiontype en lecture seule soit une bonne idée.
Maslow