Sql-соединение ожидает 15 секунд, несмотря на то, что время ожидания в строке подключения составляет 3 секунды. - PullRequest
5 голосов
/ 25 июня 2010

У меня есть веб-сайт, использующий сервер Microsoft SQL 2008 по локальной сети.Иногда компьютер с сервером SQL перезагружается, и веб-сайт не может подключиться к базе данных.Если машина включена и работает, она будет быстро реагировать.Если он выключен, нет необходимости ждать 15 секунд.3 секунды в порядке.

Я хочу отобразить извинения на веб-сайте, когда база данных недоступна, и хочу сделать это быстро.Но установка Connection Timeout=3 в строке подключения, кажется, не имеет никакого эффекта.Страница тратит 22 секунды на ожидание, прежде чем выдать SqlException на SqlConnection.Open();.

Что с этим не так?Может ли это быть скрытой конфигурацией, которая переопределяет время ожидания?

В настоящее время моя строка подключения имеет вид

Data Source=...;
Initial Catalog=...;
Integrated Security=True;
Connection Timeout=3

Если я установлю ее на ...;ConnectionTimeout=3 (без пробела),

System.ArgumentException: Keyword not supported: 'connectiontimeout'.

выдается (странно, документация MSDN указывает, что мы можем использовать обе строки).

Ответы [ 3 ]

2 голосов
/ 29 июня 2010

Существует тайм-аут, прежде чем сетевое оборудование сообщает о тайм-ауте подключения к сетевым драйверам, что, в свою очередь, уведомляет программы, ожидающие сетевой ввод-вывод.Вы можете проверить время ожидания транспортного уровня через telnet servername 1433 (при условии, что ваш sql-сервер прослушивает порт 1433).

Но 3 секунды слишком мало для процесса инициализации сетевых API-интерфейсов (при условии, что ваше веб-приложение находится в собственном пуле приложений), отправки запроса и ожидания истечения времени ожидания оборудования.Обновление BIOS / прошивки / драйвера, вероятно, не сильно сократит время отклика.

Было бы лучше выполнить соединение асинхронно.я не предлагаю использовать EndInvoke для завершения асинхронного вызова, поскольку незадачливым пользователям все еще может потребоваться 3 полных секунды, чтобы увидеть какой-либо ответ, когда база данных не работает.Возможно, Ajax-вызов лучше.Если у вас много пользователей, постоянно посещающих ваш веб-сайт, вы можете кэшировать результат проверки подключения и обновлять его таким образом, чтобы это значило для ваших пользователей.

1 голос
/ 10 сентября 2013

Следующее сообщение в блоге помогло мне решить эту проблему: http://improve.dk/controlling-sqlconnection-timeouts/

1 голос
/ 25 июня 2010

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

Не уверен, что это полезно, но когда я столкнулся с этой проблемой в прошлом, это было потому, что мне также нужно было установить SqlCommand.CommandTimeout. Что случилось со мной, так это то, что соединение было успешно открыто, затем сервер БД вышел из строя, а затем моя следующая команда не истекла так быстро, как я ожидал, исходя из времени ожидания соединения, и это было связано с необходимостью установки CommandTimeout .

...