Прерывистое исключение SQL — ошибка, связанная с сетью или конкретным экземпляром

#sql-server #database #sql-server-2008

#sql-server #База данных #sql-server-2008

Вопрос:

У нас очень странная прерывистая проблема, которая начала возникать в течение последнего месяца или около того, из-за чего некоторые подключения к серверу mssql завершаются сбоем с ошибкой:

 System.Data.SqlClient.SqlException: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)
  

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

Итак, моей первоначальной реакцией на коленный рефлекс было, что это может быть связано с:

  1. Проблема, связанная с ресурсами — итак, я начал запускать SQL profiler и perfmon, но не обнаружил никаких проблем с тем, что служба пытается справиться с количеством подключений в секунду. Я просматривал MSSQL: ошибки SQL, MSSQL: статистику ожидания, MSSQL: статистику выполнения, MSSQL: блокировки. Есть ли у кого-нибудь какие-либо рекомендации по другим статистическим данным, которые я должен здесь указывать?

  2. Незакрытые подключения к БД — я исключил это после прохождения всего кода уровня данных. У нас есть все средства защиты от сбоев, чтобы этого не происходило.

  3. Проблема, связанная с подключением / сетью: наш SQL Server находится на отдельном сервере (MS SQL Server Standard 2008) от нашего сервера приложений (работает под управлением ASP.Net на IIS7) — оба сервера работают на больших экземплярах Amazon EC2 со всеми настроенными политиками безопасности (согласно инструкциям Amazon). Кто-нибудь получил рекомендации о том, как проверить подключение между двумя серверами или может ли это быть проблемой?

  4. Возможна ли проблема со строкой подключения IIS? Я не тестировал это, но должны ли мы полностью указывать серверу имя компьютера, к которому мы подключаемся (просто подумал об этом)? Мы используем строку подключения в формате: server=xxxxx;Database=xxxx;uid=xxxx;password=xxx;

Ваши мысли и понимание очень ценятся!

Заранее спасибо

Ответ №1:

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

 SqlConnection.ClearPools;
  

Для дальнейшего использования любыми другими разработчиками, которые хотят отлаживать свой код и управлять пулами подключений, отличный ресурс можно найти здесь: http://www.codeproject.com/KB/dotnet/ADONET_ConnectionPooling.aspx

Комментарии:

1. Можете ли вы подробнее рассказать? В чем именно заключалась проблема и как именно вы ее решили?

Ответ №2:

Попробуйте изменить строку подключения на полное доменное имя порт

 server=xxxxx.domain.tld,1234;
  

Примечание: вам не нужно никакое имя экземпляра, если вы используете port

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

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

Ответ №3:

Это можно решить, переключившись на TCP / IP вместо именованных каналов, если вы можете. Возможно, вы можете проверить это, изменив имя сервера на IP-адрес сервера.

Я использую server = tcp:имя_сервера в строке подключения для принудительного выполнения TCP. KB313295

Ответ №4:

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

Если вы используете C # / VB.net

Используете ли вы инструкции «Using» для открытия соединений?

 using (System.Data.SqlClient.SqlConnection con = new SqlConnection("YourConnection string")) 
{ 
    con.Open(); 
}
  

Комментарии:

1. Спасибо за предложение — однако, как я уже сказал, я исключил это после прохождения всего кода уровня данных. У нас есть все средства защиты от сбоев, чтобы этого не происходило. Т.е. у нас уже реализованы инструкции using