Вопрос по asp.net, sql-server-2000, iis-6, sql-server, asp.net-3.5 – Что вызывает «фатальные ошибки внутренних соединений»

15

У меня есть несколько веб-сайтов ASP.Net (.Net v3.5), работающих на сервере с серверной частью базы данных SQL 2000. В течение нескольких месяцев я получал, казалось бы, случайные исключения InvalidOperationException с сообщением «Внутренняя ошибка соединения». Иногда между ними бывает несколько дней, в то время как в других случаях в день возникает множество ошибок.

Исключение не ограничивается одним конкретным сайтом, хотя они совместно используют бизнес и сборки доступа к данным. Кажется, ошибка всегда генерируется из SqlClient.TdsParser.Run (). Иногда он вызывается из прямых вызовов SqlCommand.Execute () старой школы, а иногда - из кода Linq2Sql.

Сетевые ребята заверили меня, что на их конце нет ошибок или пакетов. Кто-нибудь еще испытывал это? Может ли это быть проблема с драйверами? Мы пока не можем определить конкретный триггер для этого исключения.

Мы запускаем II6 на Windows Server 2003.

Ваш Ответ

3   ответа
1

Проверьте папку LOG вашего сервера (\ program files \ Microsoft SQL Server \ MSSQL.1 \ MSSQL \ LOG или аналогичную) на наличие файлов с именами SqlDump * .mdmp и SqlDump * .txt. Если вы обнаружите что-либо, вам придется обратиться в службу поддержки.

22

После нескольких месяцев игнорирования этой проблемы она начала достигать критической массы, поскольку трафик постепенно увеличивался. Под большой нагрузкой, включая некоторые сканеры, все сводилось с ума, и эти ошибки выливались в нон-стоп.

Методом проб и ошибок мы в конечном итоге отследили несколько запросов SqlCommand или LINQ, чьи SqlConnection не были закрыты сразу после использования. Вместо этого из-за неаккуратного программирования, возникшего из-за неправильного понимания соединений LINQ, объекты DataContext были расположены (и соединения закрыты) только в конце запроса, а не сразу.

Как только мы реорганизовали эти методы, чтобы немедленно закрыть соединение с C #, используя & quot; блок (освобождая этот пул для следующего запроса), мы не получили больше ошибок. Несмотря на то, что мы до сих пор не знаем причину, по которой этот пул соединений может быть перепутан, мы смогли устранить все ошибки этого типа. Эта проблема была решена в связи с другой похожей ошибкой, которую я разместил здесь:Почему мой SqlCommand возвращает строку, когда она должна быть int?

2

Похоже, соединение с базой данных обрывается или истекает время ожидания.

Недавно у нас были аналогичные проблемы, возникающие при переходе на IIS 6 из IIS 5 при подключении к SQL 2000. Наша проблема была решена путем увеличения числа доступных временных портов.

Посмотрите на использование временных портов на сервере IIS. Максимальное значение по умолчанию количество доступных портов обычно составляет 4000. Возможно, вы захотите увеличить его, если сайты на вашем сервере особенно заняты или ваше приложение выполняет много обращений к базе данных.

Вы можете контролировать их в первую очередь, чтобы увидеть, превышение максимального предела.

Поиск в базе знаний Майкрософт по запросу "MaxUserPort" и & quot; TcpTimedWaitDelay & quot; и внесите необходимые изменения в реестр. Убедитесь, что вы сделали резервную копию реестра или сервера снимков, прежде чем вносить изменения. Потребуется перезагрузка, чтобы изменения вступили в силу.

Вы должны дважды проверить вашу базу данных, и соединение с набором записей закрывается после использования. Не закрытие будет использовать этот диапазон портов без необходимости.

В любом случае проверьте эффективность ваших хранимых процедур, так как они могут занять больше времени, чем нужно.

& quot; Если вы быстро откроете и закроете 4000 сокетов менее чем за четыре минуты, вы достигнете максимального значения по умолчанию для клиентских анонимных портов, и новые попытки подключения сокетов завершатся неудачно, пока не истечет срок действия существующего набора сокетов TIME_WAIT. - отhttp://support.microsoft.com/kb/328476

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