web-dev-qa-db-fra.com

Délai de connexion pour le serveur SQL

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

107
zachary

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

La valeur de délai d'attente définie dans la propriété Connection Timeout est un temps exprimé en secondes . Si cette propriété n'est pas définie, la valeur de délai d'attente pour la connexion est la valeur par défaut (15 secondes).

De plus, si vous définissez la valeur du délai d'attente sur 0, vous indiquez que votre tentative de connexion attend une durée infinie. Comme décrit dans la documentation, il convient de ne pas définir cette option dans votre chaîne de connexion:

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

210
Darin Dimitrov

Hmmm ...

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

Lorsque vous obtenez des délais de connexion, vous rencontrez généralement l'un des problèmes suivants:

  1. Configuration réseau - connexion lente entre votre serveur Web/dev et le serveur SQL. Augmenter le délai d'attente peut corriger cela, mais il serait sage d'examiner le problème sous-jacent.

  2. Chaîne de connexion. J'ai rencontré des problèmes pour lesquels un nom d'utilisateur/mot de passe incorrect entraînerait, pour une raison quelconque, une erreur de dépassement de délai au lieu d'une erreur réelle indiquant "accès refusé". Cela ne devrait pas arriver, mais telle est la vie.

  3. Connection String 2: Si vous spécifiez le nom du serveur de manière incorrecte ou incomplète (par exemple, mysqlserver au 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 se trouve dans votre DNS (ou fichier hôtes), mais pointe sur une adresse IP incorrecte ou inaccessible, vous obtiendrez un dépassement de délai plutôt qu'une erreur machine-not-found-ish.

  5. La requête que vous appelez arrive à expiration. Le problème peut ressembler à celui de la connexion au serveur, mais, en fonction de la structure de votre application, vous pourriez vous rendre jusqu'au stade où votre requête est en cours d'exécution avant l'expiration du délai.

  6. La connexion fuit. Combien de processus sont en cours d'exécution? Combien de connexions ouvertes? Je ne sais pas si ADO.NET brut effectue un regroupement de connexions, ferme automatiquement les connexions lorsque cela est nécessaire dans une bibliothèque d'entreprise ou dans tout autre emplacement configuré. C'est probablement un hareng rouge. Cependant, lorsque je travaillais avec WCF et des services Web, des problèmes de connexions non fermées ont provoqué des délais d'attente et d'autres comportements imprévisibles.

Choses à essayer:

  1. Avez-vous un délai d'attente 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 sera lié à votre application, pas au serveur.

  2. Exécutez SQL Profiler et voyez ce qui se passe réellement sur le réseau. Vous devriez être capable de dire si vous vous connectez réellement ou si une requête pose problème.

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

Bonne chance!

31
3Dave

Si vous voulez le changer 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 chaîne ConnectionTimeout existe déjà dans la chaîne de connexion ou non?

De plus, il crée un objet et il est toujours bon d’attribuer une valeur à un 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);
11
Imran Rizvi