У меня есть использование веб-сайта сервер 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 указывает, что мы можем использовать обе строки).
Существует таймаут, прежде чем сетевое оборудование сообщит о таймауте соединения сетевым драйверам, которые, в свою очередь, уведомляют программы, ожидающие сетевого ввода-вывода. Вы можете проверить таймаут транспортного уровня через telnet servername 1433 (если ваш sql-сервер прослушивает порт 1433).
Но 3 секунды - это слишком мало для процесса, чтобы инициализировать сетевые API (предполагается, что ваше веб-приложение находится в собственном пуле приложений), отправить запрос и ждать таймаута оборудования. Обновление BIOS/прошивки/драйвера, вероятно, не уменьшит время отклика так сильно.
Было бы лучше выполнить соединение асинхронно. Я не предлагаю использовать EndInvoke для завершения асинхронного вызова, так как неудачливым пользователям может потребоваться ждать 3 полных секунды, чтобы увидеть любой ответ, когда база данных не работает. Возможно, лучше использовать Ajax-вызов. Если на ваш сайт постоянно заходит много пользователей, вы можете захотеть кэшировать результаты проверки подключаемости и обновлять их в удобном для пользователей виде.
ConnectionTimeout
без пробела - это имя свойства при доступе через код, а не для строки подключения.
Не уверен, что это полезно, но когда я столкнулся с этой проблемой в прошлом, мне также нужно было установить SqlCommand.CommandTimeout
. У меня происходило так: соединение открывалось успешно, затем сервер БД падал, после чего моя следующая команда не завершалась так быстро, как я ожидал, основываясь на Connection Timeout, и это происходило из-за того, что CommandTimeout
тоже нужно было установить.