Тайм-аут подключения для SQL-сервера

109

Могу ли я увеличить время ожидания, изменив строку подключения в web.config?

Zachary
источник
7
Не читайте это так, как я думал, что тайм-аут будет управлять выполнением запроса - это не так, только тайм-аут для подключения к серверу - «таймаут подключения» было бы лучшим названием. См stackoverflow.com/a/7976867/409856
downwitch

Ответы:

213

Да, вы можете добавить ;Connection Timeout=30в строку подключения и указать желаемое значение.

Значение тайм-аута, установленное в Connection Timeoutсвойстве, представляет собой время, выраженное в секундах . Если это свойство не задано, значение тайм-аута для подключения - значение по умолчанию (15 секунд).

Более того, устанавливая значение тайм-аута равным 0, вы указываете, что ваша попытка подключиться ждет бесконечное время. Как описано в документации, это то, что вы не должны указывать в строке подключения:

Значение 0 указывает на отсутствие ограничения, и его следует избегать в ConnectionString, потому что попытка подключения ждет неопределенно долго.

Дарин Димитров
источник
Вы можете дать этому пример? Я использую EF6, и у меня есть 3 миллиона данных в моей таблице, когда я делаю некоторую программу процесса, возвращающую ошибку тайм-аута ... примечание: я использую индексацию в таблице
saulyasar
4
@saulyasar Это время ожидания СОЕДИНЕНИЯ, а не время ожидания КОМАНДЫ. Тайм-аут ПОДКЛЮЧЕНИЯ - это то, как долго он будет пытаться ПОДКЛЮЧИТЬСЯ к серверу sql. Вы хотите исследовать тайм-аут COMMAND, то есть как долго процедура или инструкция будет выполняться до истечения тайм-аута.
granadaCoder
32

Хммм ...

Как сказал Дарин, вы можете указать более высокое значение тайм-аута соединения, но я сомневаюсь, что это действительно проблема.

Когда вы получаете тайм-ауты подключения, обычно проблема связана с одним из следующих:

  1. Конфигурация сети - медленное соединение между вашим веб-сервером / устройством разработки и сервером SQL. Увеличение тайм-аута может исправить это, но было бы разумно исследовать основную проблему.

  2. Строка подключения. Я встречал проблемы, когда неправильное имя пользователя / пароль по какой-то причине приводило к ошибке тайм-аута вместо реальной ошибки, указывающей «доступ запрещен». Этого не должно быть, но такова жизнь.

  3. Строка подключения 2: если вы указываете имя сервера неправильно или не полностью (например, mysqlserverвместо mysqlserver.webdomain.com), вы получите тайм-аут. Можете ли вы проверить связь с сервером, используя имя сервера, точно такое, как указано в строке подключения из командной строки?

  4. Строка подключения 3: если имя сервера указано в вашем DNS (или файле hosts), но указывает на неправильный или недоступный IP-адрес, вы получите тайм-аут, а не ошибку «машина не найдена».

  5. Срок действия запроса, который вы вызываете, истекает. Может показаться, что проблема связана с подключением к серверу, но, в зависимости от того, как структурировано ваше приложение, вы можете пройти весь путь до этапа, на котором выполняется ваш запрос, до истечения времени ожидания.

  6. Утечки в соединениях. Сколько процессов запущено? Сколько открытых подключений? Я не уверен, выполняет ли необработанный ADO.NET пул соединений, автоматически закрывает соединения, когда это необходимо, например, Enterprise Library, или где все это настроено. Это, наверное, отвлекающий маневр. Однако при работе с WCF и веб-службами у меня возникали проблемы с незакрытыми соединениями, вызывающими тайм-ауты и другое непредсказуемое поведение.

Что стоит попробовать:

  1. Есть ли у вас тайм-аут при подключении к серверу с помощью SQL Management Studio? Если это так, скорее всего, проблема в конфигурации сети. Если вы не видите проблемы при подключении к Management Studio, проблема будет в вашем приложении, а не на сервере.

  2. Запустите SQL Profiler и посмотрите, что на самом деле происходит по сети. Вы должны быть в состоянии определить, действительно ли вы подключаетесь или проблема в запросе.

  3. Запустите свой запрос в Management Studio и посмотрите, сколько времени это займет.

Удачи!

3Dave
источник
если время ожидания вашего запроса истекло, я думаю, вы получите время ожидания команды
user55474
@ user55474 наверное; зависит ( очень редко) от того, как это называется.
3ave
Не в соответствии с этим сообщением в блоге msdn
tom redfern
@hugh Кажется, я сказал, что это редко, но я видел это из первых рук.
3ave
1
+1 за «Запустить SQL Profiler». Похоже, это будет сложно, но на самом деле вы просто нажимаете «Инструменты> SQL Server Profiler» и смотрите, что ваше приложение сообщает SQL Server. Оказывается, у меня был Вариант №5 :)
Эндрю Квочик
11

Если вы хотите его динамически изменять, я предпочитаю использовать SqlConnectionStringBuilder .

Он позволяет преобразовать ConnectionString, т.е. строку, в класс Object. Все свойства строки подключения станут ее членом.

В этом случае реальным преимуществом будет то, что вам не нужно беспокоиться о том, существует ли строковая часть ConnectionTimeout в строке подключения или нет?

Также, поскольку он создает объект, и всегда полезно назначать значение в объекте, а не манипулировать строкой.

Вот пример кода:

var sscsb = new SqlConnectionStringBuilder(_dbFactory.Database.ConnectionString);

sscsb.ConnectTimeout = 30;

var conn = new SqlConnection(sscsb.ConnectionString);
Имран Ризви
источник
2
Не могу поверить, что создание ConnectionTimeoutсвойства SqlConnectionтипа только для чтения считалось хорошей идеей.
Маслоу