Jaka jest różnica między SqlCommand.CommandTimeout i SqlConnection.ConnectionTimeout?


Odpowiedzi:


127

Tak. CommandTimeoutto czas, który może zająć wykonanie pojedynczego polecenia. ConnectionTimeoutto jak długo może zająć nawiązanie połączenia z serwerem, aby rozpocząć.

Na przykład możesz wykonywać stosunkowo długo działające zapytania - wykonanie ich w ciągu 10 minut jest całkowicie w porządku, ale jeśli rozpoczęcie połączenia zajęło 10 minut, wiedziałbyś, że coś jest nie tak.


5
Ze względu na argumentację, powiedzmy, że mam! ** & # Q @? zapytanie, którego uruchomienie trwa 32 sekundy. Jeśli ustawię SqlCommand.CommandTimeout = 40, ale pozostawię SqlConnection.ConnectionTimeout na jego wartości domyślnej (prawdopodobnie 30), czy limit czasu połączenia zostanie przekroczony? Innymi słowy, czy muszę ustawić obie właściwości? Wygląda na to, że mówisz „nie”, ale musiałem zapomnieć o właściwości SqlConnection.ConnectionTimeout i zacząłem zastanawiać się, czy ustawienie CommandTimeout robi wszystko, czego potrzebuję.
flipdoubt

29
flipdoubt - CommandTimeout wpłynie na zapytanie, a ConnectionTimout nie. ConnectionTimout nie jest limitem czasu dla połączenia do zapytań peform - jest to po prostu limit czasu dla połączenia, aby połączyć się z bazą danych w pierwszej kolejności.
Robin Bennett

1
@JonSkeet czy CommandTimeout i ConnectionTimeout, oba generują ten sam wspólny wyjątek? Albo różne wyjątki?
Yasser Shaikh

1
@Yasser: Nie wiem, boję się.
Jon Skeet

6
Należy pamiętać, że CommandTimeout wydaje się mieć zastosowanie tylko do momentu, w którym pierwszy wiersz jest zwracany z SQL Server do kodu klienta. Na przykład, jeśli masz zapytanie, które zwraca pierwszy wiersz w ciągu 30 sekund, ale pełny zestaw wierszy zwraca godziny, ustawienie limitu czasu na 30 sekund nie spowoduje przekroczenia limitu czasu zapytania, a zapytanie będzie działać przez wiele godzin. Dzieje się tak głównie w przypadku, gdy nie masz operatorów blokujących (takich jak Zlecenie do) na LHS planu wykonania. (Publikowanie, ponieważ spędziłem 2 dni na debugowaniu tego i żadnego innego odniesienia na ten temat)
Dave

28

SqlCommand.CommandTimeout= limit czasu dla zapytania SQL. Oznacza, ile czasu (np .: SELECT, UPDATE) zapytanie może zająć do jego wykonania. Jeśli przekroczy SqlCommand.CommandTimeout, zatrzymuje wykonywanie. Wystąpi błąd przekroczenia limitu czasu polecenia.

SqlConnection.ConnectionTimeout= limit czasu połączenia. Oznacza, ile czasu obiekt połączenia może próbować się połączyć. Jeśli przekroczy określony czas, przerywa łączenie. Wystąpi błąd przekroczenia limitu czasu połączenia.


11

ConnectionTimeoutokreśla czas oczekiwania przed przekroczeniem limitu czasu podczas próby otwarcia pliku SqlConnection. Ma to znaczenie dla Connection.Open()polecenia.

podczas

SqlCommand.CommandTimeoutokreślono czas trwania, przez który SqlCommand ma czekać przed przekroczeniem limitu czasu. Dzieje się tak po otwarciu połączenia i ExecuteXXXwywołaniu jednej z metod w obiekcie Command.


8

Dodatkowe informacje

Wartość domyślna CommandTimeoutto 30 sekund. Zero (0) oznacza brak ograniczeń. Możesz ustawić CommandTimeoutwartość tylko w kodowaniu.

Wartość domyślna ConnectiontTimeoutto 15 sekund. Zero (0) również oznacza brak limitu. Otrzymana wartość mniejsza niż zero (wartość minus) ArgumentException. Możesz ustawić ConnectionTimeoutwartość zarówno w pliku kodowania, jak i pliku konfiguracyjnego.


0
select @@LOCK_TIMEOUT //get the TIMEOUT,default is -1
set LOCK_TIMEOUT = 600//set TIMEOUT with ms

2
To jest trzeci typ limitu czasu. Żaden z dwóch, o które pyta właściciel tematu. I nie odpowiada na pytanie. Ja tego nie zrobię, bo nie wiem, jakie było pytanie przed edycją.
Csaba Toth

0

Krótka uwaga dotycząca CommandTimeout, ponieważ jest to właściwość obiektów Connection i Command ...

Ustawienie CommandTimeout w obiekcie Connection nie ma wpływu na ustawienie CommandTimeout w obiekcie Command w tym samym Connection; oznacza to, że właściwość CommandTimeout obiektu Command nie dziedziczy wartości wartości CommandTimeout obiektu Connection.

Dlatego ustawienie CommandTimeout w obiekcie Connection ma wpływ tylko na polecenia wykonywane w ramach obiektu Connection (bez używania obiektu Command).

np. kiedy łączysz się ze składowanym procesem i dodajesz parametry do obiektu polecenia i wykonujesz obiekt polecenia przy użyciu połączenia obiektu połączenia, musisz ustawić CommandTimeout w obiekcie Command i ConnectionTimeout w obiekcie Connection, aby zastąpić oba domyślne. Ustawienie CommandTimeout w obiekcie Connection nie spowoduje zastąpienia domyślnego limitu czasu dla poleceń obiektu polecenia.

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.