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

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

Ответ 1

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

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

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

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

Ответ 2

Хммм...

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

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

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

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

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

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

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

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

Что нужно попробовать:

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

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

  • Запустите запрос в Management Studio и посмотрите, сколько времени потребуется.

Удачи!

Ответ 3

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

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

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

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

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

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

sscsb.ConnectTimeout = 30;

var conn = new SqlConnection(sscsb.ConnectionString);