Как тайм-аут "Ошибка, связанная с сетью или экземпляра произошла при установлении подключения к SQL Server" ошибка
Я использую SQL Server, и иногда моя база данных отключается для обслуживания. У меня есть код обработки ошибок, поэтому пользователь не видит страницу ошибки, вместо этого он видит приятное и понятное сообщение об ошибке. Мой вопрос: когда база данных не работает, страница загружается и показывает сообщение об ошибке очень долго. Я думал, что это как-то связано со свойством timeout, но меняя его, используя
command.CommandTimeout = 5;
или же
Connect Timeout=5;
в web.config в connectionString
кажется, не помогает, и загрузка страницы все еще занимает много времени (около 40 секунд). Есть ли способ минимизировать это время?
Исключение, которое выдается и регистрируется:
При установке соединения с SQL Server произошла ошибка, связанная с сетью или экземпляром. Сервер не найден или не был доступен. Убедитесь, что имя экземпляра указано правильно и что SQL Server настроен для разрешения удаленных подключений. (поставщик: поставщик TCP, ошибка: 0 - попытка подключения не удалась, потому что подключенная сторона не ответила должным образом через некоторое время, или не удалось установить соединение, так как подключенный хост не смог ответить.)
2 ответа
Если тайм-аут подключения к вашему серверу занимает слишком много времени, проверьте:
- тип строки подключения (поставщик.NET, OLEDB или другой), они могут иметь разные имена для одной и той же вещи
- если вы действительно используете строку подключения, о которой идет речь; Вы могли бы на самом деле использовать совершенно другую строку подключения
- изолируйте свой блок тайм-аута try/catch для переноса просто conn.Open() - таким образом, вы действительно знаете, что открытие соединения занимает слишком много времени; Я не говорю, что ваше исключение не показательно, просто я не уверен на 100%, что все это время потрачено только на conn.Open ()
Хорошо, тогда.
Я бы создал базовый класс для всех ваших классов "уровня доступа к данным".
public class DataBaseLayer ()
{
public DataBaseLayer()
{ /* check for appSetting here and throw a SqlServerMaintenanceModeException exception (custom exception) */}
}
public class EmployeeDataLayer : DataBaseLayer ()
{
public EmployeeDataLayer() : base ()
}
В конструкторе я бы проверял appSetting... на "true" или "false"......... и выбрасывал CustomException
public class SqlServerMaintenanceModeException : ApplicationException
{}
бросить его в конструктор DataBaseLayer...... тогда все остальное обработать.
Таким образом... затрагиваются только страницы, управляемые "db".
Небольшая причина, по которой я не люблю проверять "тайм-аут", заключается в том, что..
- Это немного непредсказуемо.
- Иногда это нормальное исключение....... как переключение в вашей сети. Как вы скажете разницу?
Мне очень не нравятся неоднозначные исключения.