Puis-je augmenter le délai en modifiant la chaîne de connexion dans le web.config
?
Puis-je augmenter le délai en modifiant la chaîne de connexion dans le web.config
?
Réponses:
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 Timeout
proprié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.
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:
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.
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.
Chaîne de connexion 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?
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.
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.
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:
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.
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.
Exécutez votre requête dans Management Studio et voyez combien de temps cela prend.
Bonne chance!
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);
ConnectionTimeout
propriété sur le SqlConnection
type en lecture seule soit une bonne idée.