2009-07-20 3 views
14

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

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

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

Мы бежим II6 на Windows Server 2003.

ответ

21

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

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

После того как мы реорганизовали эти методы, чтобы немедленно закрыть соединение с блоком C# «using» (освободив этот пул для следующего запроса), мы не получили больше ошибок. Хотя мы до сих пор не знаем основной причины, по которой пул соединений будет настолько запутан, мы смогли прекратить все ошибки такого типа. Эта проблема была решена в связи с другой аналогичной ошибкой, опубликованной мной: Why is my SqlCommand returning a string when it should be an int?

1

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

1

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

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

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

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

Искать в базе знаний Майкрософт для «MaxUserPort» и «TcpTimedWaitDelay» и внести необходимые изменения в реестр. Перед внесением изменений убедитесь, что вы создали резервную копию реестра или сервера моментальных снимков. Будет необходимо перезагрузить, чтобы изменения вступили в силу.

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

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

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

Смежные вопросы