В чем разница между SqlCommand.CommandTimeout и SqlConnection.ConnectionTimeout?

88

Есть ли разница между SqlCommand.CommandTimeoutи SqlConnection.ConnectionTimeoutв .NET?

Дханапал
источник
это специфично для MS SQL Server?
ympostor

Ответы:

127

Да. CommandTimeoutсколько времени может занять выполнение одной команды. ConnectionTimeoutсколько времени может потребоваться для установления соединения с сервером для начала.

Например, вы можете выполнять относительно долго выполняющиеся запросы - для них вполне нормально, что на их выполнение требуется 10 минут, но если для начала соединения потребовалось 10 минут, вы бы знали, что что-то сильно не так.

Джон Скит
источник
5
Допустим, у меня есть! ** & # Q @? запрос, выполнение которого занимает 32 секунды. Если я установлю SqlCommand.CommandTimeout = 40, но оставлю SqlConnection.ConnectionTimeout по умолчанию (предположительно 30), будет ли тайм-аут соединения? Другими словами, нужно ли устанавливать оба свойства? Похоже, вы говорите «нет», но я, должно быть, забыл о свойстве SqlConnection.ConnectionTimeout и начал задаваться вопросом, делает ли установка CommandTimeout все, что мне нужно.
flipdoubt 05
29
flipdoubt - CommandTimeout повлияет на запрос, ConnectionTimout - нет. ConnectionTimout - это не тайм-аут для соединения для выполнения запросов - это просто тайм-аут для соединения в первую очередь для подключения к базе данных.
Робин Беннетт
1
@JonSkeet делают CommandTimeout и ConnectionTimeout, оба генерируют одно и то же общее исключение? Или разные исключения?
Ясир Шейх
1
@ Яссер: Не знаю, боюсь.
Джон Скит,
6
Имейте в виду, что CommandTimeout применяется только до момента, когда первая строка возвращается из SQL Server в клиентский код. Например, если у вас есть запрос, который возвращает первую строку в течение 30 секунд, но для возврата полного набора строк требуется несколько часов, установка тайм-аута на 30 секунд не приведет к тайм-ауту запроса и запрос будет выполняться в течение нескольких часов. В основном это происходит, если у вас нет блокирующих операторов (таких как Order by) в левой части вашего плана выполнения. (Публикация, потому что я потратил 2 дня на отладку этой и никакой другой ссылки на эту тему)
Дэйв
28

SqlCommand.CommandTimeout= предел времени ожидания для вашего SQL-запроса. Означает, сколько времени (например SELECT, UPDATE) запрос может занять для его выполнения. Если он превышает SqlCommand.CommandTimeout, то выполнение останавливается. Произойдет ошибка тайм-аута команды.

SqlConnection.ConnectionTimeout= предел времени ожидания для вашего соединения. Означает, сколько времени ваш объект подключения может пытаться подключиться. Если он превышает указанное время, он прекращает подключение. Произойдет ошибка тайм-аута подключения.

NinethSense
источник
11

ConnectionTimeoutопределяет продолжительность ожидания до истечения времени ожидания при попытке открытьSqlConnection . Это относится к Connection.Open()команде.

пока

SqlCommand.CommandTimeoutуказал продолжительность ожидания SqlCommand до истечения времени ожидания. Это происходит после того, как соединение было открыто и один из ExecuteXXXметодов был вызван для объекта Command.

Церебр
источник
8

Дополнительная информация

Значение по умолчанию CommandTimeout- 30 секунд. Ноль (0) означает отсутствие ограничения. Вы можете установить CommandTimeoutзначение только в кодировании.

Значение по умолчанию ConnectiontTimeout- 15 секунд. Ноль (0) также означает отсутствие ограничения. Получится значение меньше нуля (минус значение) ArgumentException. Вы можете установить ConnectionTimeoutзначение как в файле Coding, так и в файле конфигурации.

Хтин Аунг
источник
0
select @@LOCK_TIMEOUT //get the TIMEOUT,default is -1
set LOCK_TIMEOUT = 600//set TIMEOUT with ms
уклоняться
источник
2
Это 3-й тип тайм-аута. Ни один из двух, о которых спрашивает владелец темы. И не отвечает на вопрос. Я не буду -1, потому что не знаю, в чем был вопрос перед редактированием.
Csaba Toth
0

Небольшое примечание относительно CommandTimeout, поскольку это свойство как объектов Connection, так и Command ...

Параметр CommandTimeout для объекта Connection не влияет на параметр CommandTimeout для объекта Command в том же Connection; то есть свойство CommandTimeout объекта Command не наследует значение значения CommandTimeout объекта Connection.

Таким образом, параметр CommandTimeout в объекте Connection влияет только на команды, выполняемые только под объектом Connection (без использования объекта Command).

например, когда вы подключаетесь к хранимой процедуре и добавляете параметры к объекту команды и выполняете объект Command с использованием соединения объекта подключения, тогда вам нужно будет установить CommandTimeout для объекта Command и ConnectionTimeout для объекта Connection, чтобы переопределить оба по умолчанию. Установка CommandTimeout для объекта подключения не отменяет тайм-аут по умолчанию для команд объекта Command.

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 / справочник / ado-api / connectiontimeout-property-ado? view = sql-server-ver15

Брэд Скидмор
источник