Was ist der Unterschied zwischen SqlCommand.CommandTimeout und SqlConnection.ConnectionTimeout?

85

Gibt es einen Unterschied zwischen SqlCommand.CommandTimeoutund SqlConnection.ConnectionTimeoutin .NET?

Dhanapal
quelle
Ist dies spezifisch für MS SQL Server?
ympostor

Antworten:

124

Ja. CommandTimeoutist, wie lange ein einzelner Befehl dauern kann. ConnectionTimeoutGibt an, wie lange es dauern kann, bis eine Verbindung zum Server hergestellt ist.

Beispielsweise führen Sie möglicherweise Abfragen mit relativ langer Laufzeit aus. Es ist vollkommen in Ordnung, dass der Vorgang 10 Minuten dauert. Wenn Sie jedoch zunächst 10 Minuten benötigen, um die Verbindung herzustellen, wissen Sie, dass ein Fehler vorliegt.

Jon Skeet
quelle
5
Nehmen wir zum Zwecke der Argumentation an, ich habe ein! ** & # Q @? Abfrage, deren Ausführung 32 Sekunden dauert. Wenn ich SqlCommand.CommandTimeout = 40 setze, aber SqlConnection.ConnectionTimeout auf dem Standardwert (vermutlich 30) belasse, wird das Verbindungszeitlimit überschritten? Mit anderen Worten, muss ich beide Eigenschaften festlegen? Es hört sich so an, als würden Sie "Nein" sagen, aber ich muss die SqlConnection.ConnectionTimeout-Eigenschaft vergessen und mich gefragt haben, ob das Festlegen von CommandTimeout alles tut, was ich brauche.
Flipdoubt
28
flipdoubt - Das CommandTimeout wirkt sich auf die Abfrage aus, das ConnectionTimout nicht. Das ConnectionTimout ist kein Zeitlimit für die Verbindung zum Ausführen von Abfragen. Es ist lediglich das Zeitlimit für die Verbindung, um überhaupt eine Verbindung zur Datenbank herzustellen.
Robin Bennett
1
@ JonSkeet Generieren CommandTimeout und ConnectionTimeout beide dieselbe gemeinsame Ausnahme? Oder andere Ausnahmen?
Yasser Shaikh
1
@ Yasser: Ich weiß nicht, ich habe Angst.
Jon Skeet
6
Beachten Sie, dass CommandTimeout anscheinend nur bis zu dem Punkt gilt, an dem die erste Zeile von SQL Server an den Clientcode zurückgegeben wird. Wenn Sie beispielsweise eine Abfrage haben, die die erste Zeile innerhalb von 30 Sekunden zurückgibt, die Rückgabe des gesamten Rowsets jedoch Stunden dauert, wird die Abfrage durch Festlegen des Zeitlimits auf 30 Sekunden nicht zeitlich begrenzt und die Abfrage wird stundenlang ausgeführt. Dies ist hauptsächlich dann der Fall, wenn Sie keine Sperroperatoren (z. B. einen Auftrag von) in der LHS Ihres Ausführungsplans haben. (Posting, weil ich 2 Tage damit verbracht habe, dies und keine andere Referenz zu diesem Thema zu debuggen)
Dave
28

SqlCommand.CommandTimeout = Zeitlimit für Ihre SQL-Abfrage. Bedeutet, wie viel Zeit eine Abfrage (z. B. SELECT, UPDATE) für ihre Ausführung benötigen kann. Wenn es SqlCommand.CommandTimeout überschreitet, stoppt es die Ausführung. Ein Befehlszeitlimitfehler tritt auf.

SqlConnection.ConnectionTimeout = Zeitlimit für Ihre Verbindung. Bedeutet, wie viel Zeit Ihr Verbindungsobjekt versuchen kann, eine Verbindung herzustellen. Wenn die angegebene Zeit überschritten wird, wird die Verbindung unterbrochen. Ein Verbindungs-Timeout-Fehler tritt auf.

NinethSense
quelle
11

ConnectionTimeoutGibt die Wartezeit an, bevor beim Versuch, eine zu öffnen, eine Zeitüberschreitung auftrittSqlConnection . Es ist relevant für den Connection.Open()Befehl.

während

SqlCommand.CommandTimeouthat die Dauer angegeben, die ein SqlCommand warten soll, bevor eine Zeitüberschreitung auftritt. Dies geschieht, nachdem eine Verbindung geöffnet und eine der ExecuteXXXMethoden für das Command-Objekt aufgerufen wurde.

Cerebrus
quelle
8

Zusätzliche Information

Der Standardwert von CommandTimeoutist 30 Sekunden. Null (0) zeigt keine Begrenzung an. Sie können den CommandTimeoutWert nur in Codierung festlegen .

Der Standardwert von ConnectiontTimeoutist 15 Sekunden. Null (0) zeigt ebenfalls keine Begrenzung an. Ein Wert unter Null (Minuswert) wird erhalten ArgumentException. Sie können den ConnectionTimeoutWert sowohl in der Codierungs- als auch in der Konfigurationsdatei festlegen .

Htin Aung
quelle
0
select @@LOCK_TIMEOUT //get the TIMEOUT,default is -1
set LOCK_TIMEOUT = 600//set TIMEOUT with ms
Ausweichen
quelle
2
Dies ist eine dritte Art von Zeitüberschreitung. Keiner der beiden, nach denen der Themeninhaber fragt. Und beantwortet die Frage nicht. Ich werde es nicht -1, weil ich nicht weiß, was die Frage vor der Bearbeitung war.
Csaba Toth
0

Kurzer Hinweis zu CommandTimeout, da es eine Eigenschaft von Connection- und Command-Objekten ist ...

Die CommandTimeout-Einstellung für ein Verbindungsobjekt hat keine Auswirkungen auf die CommandTimeout-Einstellung für ein Command-Objekt für dieselbe Verbindung. Das heißt, die CommandTimeout-Eigenschaft des Command-Objekts erbt nicht den Wert des CommandTimeout-Werts des Verbindungsobjekts.

Die CommandTimeout-Einstellung für ein Verbindungsobjekt wirkt sich also nur auf Befehle aus, die nur unter dem Verbindungsobjekt ausgeführt werden (ohne Verwendung eines Befehlsobjekts).

Wenn Sie beispielsweise eine Verbindung zu einem gespeicherten Prozess herstellen und dem Befehlsobjekt Parameter hinzufügen und das Befehlsobjekt über die Verbindung eines Verbindungsobjekts ausführen, müssen Sie CommandTimeout für das Command-Objekt und ConnectionTimeout für das Connection-Objekt festlegen, um beide zu überschreiben Standardeinstellungen. Durch Festlegen des CommandTimeout für das Verbindungsobjekt wird das Standardzeitlimit für die Command Object-Befehle nicht überschrieben.

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 / verbindungszeitüberschreitung-eigenschaft-ado? view = sql-server-ver15

Brad Skidmore
quelle