Могу ли я увеличить время ожидания, изменив строку подключения в web.config
?
Тайм-аут подключения для SQL-сервера
Ответ 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);