Как тайм-аут "Ошибка, связанная с сетью или экземпляра произошла при установлении подключения к 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".

Небольшая причина, по которой я не люблю проверять "тайм-аут", заключается в том, что..

  1. Это немного непредсказуемо.
  2. Иногда это нормальное исключение....... как переключение в вашей сети. Как вы скажете разницу?

Мне очень не нравятся неоднозначные исключения.

Другие вопросы по тегам