Quelle est la différence entre SqlCommand.CommandTimeout et SqlConnection.ConnectionTimeout?

88

Y a-t-il une différence entre SqlCommand.CommandTimeoutet SqlConnection.ConnectionTimeoutdans .NET?

Dhanapal
la source
est-ce spécifique à MS SQL Server?
ympostor

Réponses:

127

Oui. CommandTimeoutest le temps qu'une seule commande peut prendre pour se terminer. ConnectionTimeoutest le temps nécessaire pour établir une connexion au serveur au départ.

Par exemple, vous exécutez peut-être des requêtes relativement longues - il est parfaitement normal qu'elles prennent 10 minutes, mais si cela prenait 10 minutes pour démarrer la connexion, vous sauriez que quelque chose n'allait vraiment pas.

Jon Skeet
la source
5
Par souci d'argumentation, disons que j'ai un! ** & # Q @? requête qui prend 32 secondes pour s'exécuter. Si je règle SqlCommand.CommandTimeout = 40 mais laisse SqlConnection.ConnectionTimeout à sa valeur par défaut (vraisemblablement 30), la connexion expirera-t-elle? En d'autres termes, dois-je définir les deux propriétés? Il semble que vous disiez «non», mais j'ai dû oublier la propriété SqlConnection.ConnectionTimeout et j'ai commencé à me demander si la configuration de CommandTimeout fait tout ce dont j'ai besoin.
flipdoubt
29
flipdoubt - le CommandTimeout affectera la requête, pas le ConnectionTimout. Le ConnectionTimout n'est pas un délai d'expiration pour la connexion pour effectuer des requêtes - c'est juste le délai d'expiration de la connexion pour se connecter à la base de données en premier lieu.
Robin Bennett
1
@JonSkeet fait CommandTimeout et ConnectionTimeout, tous deux génèrent la même exception commune? Ou différentes exceptions?
Yasser Shaikh
1
@Yasser: Je ne sais pas, j'ai peur.
Jon Skeet
6
Gardez à l'esprit que CommandTimeout semble s'appliquer uniquement jusqu'au point où la première ligne est renvoyée de SQL Server au code client. Par exemple, si vous avez une requête qui renvoie la première ligne dans les 30 secondes, mais que l'ensemble de lignes complet prend des heures à être renvoyé, la définition du délai d'expiration à 30 secondes n'expire pas la requête et la requête s'exécute pendant des heures. C'est principalement le cas si vous n'avez pas d'opérateurs de blocage (comme un ordre par) sur la LHS de votre plan d'exécution. (Publication parce que j'ai passé 2 jours à déboguer ceci et aucune autre référence sur le sujet)
Dave
28

SqlCommand.CommandTimeout= délai d'expiration de votre requête SQL. Les moyens, combien de temps un (par exemple: SELECT, UPDATE) une requête peut prendre pour son exécution. S'il dépasse SqlCommand.CommandTimeout, alors il arrête l'exécution. Une erreur de temporisation de commande se produira.

SqlConnection.ConnectionTimeout= délai d'expiration de votre connexion. Cela signifie combien de temps votre objet de connexion peut essayer de se connecter. S'il dépasse la durée spécifiée, la connexion s'arrête. Une erreur de temporisation de connexion se produira.

NinethSense
la source
11

ConnectionTimeoutspécifie la durée d'attente avant l'expiration du délai lors de la tentative d' ouverture d' un fichierSqlConnection . Il est pertinent pour la Connection.Open()commande.

tandis que

SqlCommand.CommandTimeoutspécifié la durée pendant laquelle un SqlCommand doit attendre avant l'expiration du délai. Cela se produit une fois qu'une connexion a été ouverte et qu'une des ExecuteXXXméthodes a été appelée sur l'objet Command.

Cerebrus
la source
8

Information additionnelle

La valeur par défaut CommandTimeoutest de 30 secondes. Zéro (0) indique aucune limite. Vous ne pouvez définir la CommandTimeoutvaleur que dans le codage.

La valeur par défaut ConnectiontTimeoutest de 15 secondes. Zéro (0) indique également aucune limite. Une valeur inférieure à zéro (valeur moins) sera obtenue ArgumentException. Vous pouvez définir la ConnectionTimeoutvaleur dans les fichiers de codage et de configuration.

Htin Aung
la source
0
select @@LOCK_TIMEOUT //get the TIMEOUT,default is -1
set LOCK_TIMEOUT = 600//set TIMEOUT with ms
esquivant
la source
2
Il s'agit d'un 3ème type de timeout. Pas un des deux que le propriétaire du sujet demande. Et ne répond pas à la question. Je ne le ferai pas, car je ne sais pas quelle était la question avant les modifications.
Csaba Toth
0

Note rapide concernant CommandTimeout, car il s'agit d'une propriété des objets Connection et Command ...

Le paramètre CommandTimeout sur un objet Connection n'a aucun effet sur le paramètre CommandTimeout sur un objet Command sur la même connexion; autrement dit, la propriété CommandTimeout de l'objet Command n'hérite pas de la valeur de la valeur CommandTimeout de l'objet Connection.

Ainsi, le paramètre CommandTimeout sur un objet Connection affecte uniquement les commandes exécutées sous l'objet Connection uniquement (sans utiliser d'objet Command).

Par exemple, lorsque vous vous connectez à un processus stocké et que vous ajoutez des paramètres à l'objet de commande et que vous exécutez l'objet de commande à l'aide de la connexion d'un objet de connexion, vous devez définir CommandTimeout sur l'objet Command et ConnectionTimeout sur l'objet Connection pour remplacer les deux les valeurs par défaut. La définition de CommandTimeout sur l'objet de connexion ne remplacera pas le délai par défaut pour les commandes d'objet de commande.

https://docs.microsoft.com/en-us/sql/ado/reference/ado-api/commandtimeout-property-ado?view=sql-server-ver15 https://docs.microsoft.com/en-us / sql / ado / reference / ado-api / connectiontimeout-property-ado? view = sql-server-ver15

Brad Skidmore
la source