Соединение Sql ожидает 15 секунд несмотря на тайм-аут 3 секунд в строке подключения

У меня есть использование веб-сайта сервер 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 указывает, что мы можем использовать обе строки).

6
задан Arseni Mourzenko 24 June 2010 в 21:35
поделиться

2 ответа

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

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

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

2
ответ дан 17 December 2019 в 04:41
поделиться

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

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

1
ответ дан 17 December 2019 в 04:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: