Могу ли я увеличить время ожидания, изменив строку подключения в web.config
?
Могу ли я увеличить время ожидания, изменив строку подключения в web.config
?
Ответы:
Да, вы можете добавить ;Connection Timeout=30
в строку подключения и указать желаемое значение.
Значение тайм-аута, установленное в Connection Timeout
свойстве, представляет собой время, выраженное в секундах . Если это свойство не задано, значение тайм-аута для подключения - значение по умолчанию (15 секунд).
Более того, устанавливая значение тайм-аута равным 0
, вы указываете, что ваша попытка подключиться ждет бесконечное время. Как описано в документации, это то, что вы не должны указывать в строке подключения:
Значение 0 указывает на отсутствие ограничения, и его следует избегать в ConnectionString, потому что попытка подключения ждет неопределенно долго.
Хммм ...
Как сказал Дарин, вы можете указать более высокое значение тайм-аута соединения, но я сомневаюсь, что это действительно проблема.
Когда вы получаете тайм-ауты подключения, обычно проблема связана с одним из следующих:
Конфигурация сети - медленное соединение между вашим веб-сервером / устройством разработки и сервером SQL. Увеличение тайм-аута может исправить это, но было бы разумно исследовать основную проблему.
Строка подключения. Я встречал проблемы, когда неправильное имя пользователя / пароль по какой-то причине приводило к ошибке тайм-аута вместо реальной ошибки, указывающей «доступ запрещен». Этого не должно быть, но такова жизнь.
Строка подключения 2: если вы указываете имя сервера неправильно или не полностью (например, mysqlserver
вместо mysqlserver.webdomain.com
), вы получите тайм-аут. Можете ли вы проверить связь с сервером, используя имя сервера, точно такое, как указано в строке подключения из командной строки?
Строка подключения 3: если имя сервера указано в вашем DNS (или файле hosts), но указывает на неправильный или недоступный IP-адрес, вы получите тайм-аут, а не ошибку «машина не найдена».
Срок действия запроса, который вы вызываете, истекает. Может показаться, что проблема связана с подключением к серверу, но, в зависимости от того, как структурировано ваше приложение, вы можете пройти весь путь до этапа, на котором выполняется ваш запрос, до истечения времени ожидания.
Утечки в соединениях. Сколько процессов запущено? Сколько открытых подключений? Я не уверен, выполняет ли необработанный ADO.NET пул соединений, автоматически закрывает соединения, когда это необходимо, например, Enterprise Library, или где все это настроено. Это, наверное, отвлекающий маневр. Однако при работе с WCF и веб-службами у меня возникали проблемы с незакрытыми соединениями, вызывающими тайм-ауты и другое непредсказуемое поведение.
Что стоит попробовать:
Есть ли у вас тайм-аут при подключении к серверу с помощью SQL Management Studio? Если это так, скорее всего, проблема в конфигурации сети. Если вы не видите проблемы при подключении к Management Studio, проблема будет в вашем приложении, а не на сервере.
Запустите SQL Profiler и посмотрите, что на самом деле происходит по сети. Вы должны быть в состоянии определить, действительно ли вы подключаетесь или проблема в запросе.
Запустите свой запрос в Management Studio и посмотрите, сколько времени это займет.
Удачи!
Если вы хотите его динамически изменять, я предпочитаю использовать SqlConnectionStringBuilder .
Он позволяет преобразовать ConnectionString, т.е. строку, в класс Object. Все свойства строки подключения станут ее членом.
В этом случае реальным преимуществом будет то, что вам не нужно беспокоиться о том, существует ли строковая часть ConnectionTimeout в строке подключения или нет?
Также, поскольку он создает объект, и всегда полезно назначать значение в объекте, а не манипулировать строкой.
Вот пример кода:
var sscsb = new SqlConnectionStringBuilder(_dbFactory.Database.ConnectionString);
sscsb.ConnectTimeout = 30;
var conn = new SqlConnection(sscsb.ConnectionString);
ConnectionTimeout
свойства SqlConnection
типа только для чтения считалось хорошей идеей.