Назад | Перейти на главную страницу

Истекло время ожидания SQL Server 2008

Я задал приведенный ниже вопрос о Stackoverflow без каких-либо ответов, однако кто-то предложил мне задать вопрос и о сбое сервера. Надеюсь, кто-то сможет помочь.

Недавно я опубликовал свое веб-приложение ASP.Net MVC 3 (Entity Framework 4.1 для сохранения данных) на работающем сервере. Приложение находится на одном веб-сервере, а база данных (SQL Server 2008) находится на другом отдельном сервере.

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

У меня также есть ELMAH (модули регистрации ошибок и обработчики для ASP.NET), интегрированные в сайт, и я уже получил несколько экземпляров следующей ошибки

System.Data.SqlClient.SqlException: истекло время ожидания. Время ожидания истекло до завершения операции или сервер не отвечает.

Ниже представлена ​​полная информация, предоставленная ELMAH.

System.Data.EntityException: сбой базового поставщика при открытии. ---> System.Data.SqlClient.SqlException: истекло время ожидания. Время ожидания истекло до завершения операции или сервер не отвечает. в System.Data.SqlClient.SqlInternalConnection.OnError (исключение SqlException, логическое breakConnection) в System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning () в System.Data.SqlClient.TdsParserStateObject.ReadSniErrorStateObject.ReadSniError .SqlClient.TdsParserStateObject.ReadSni (DbAsyncResult asyncResult, TdsParserStateObject stateObj) в System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket () в System.Data.SqlClient. SqlClient.TdsParser.Connect (ServerInfo serverInfo, SqlInternalConnectionTds connHandler, логическое ignoreSniOpenTimeout, Int64 timerExpire, логическое шифрование, логическое значение trustServerCert, логическое значение IntegratedSecurity, логическое значение интегрированной безопасности) в System.Data.SqlConnectionServerCert, Boolean IntegratedSecurity, StringInternalLineTextText (сервер) SqlConnection owningObject) в System.Data.S qlClient.SqlInternalConnectionTds.LoginWithFailover (Boolean useFailoverHost, ServerInfo primaryServerInfo, String failoverHost, String новый_пароль, булева redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, TimeoutTimer тайм-аут) при System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist (SqlConnection owningObject, TimeoutTimer тайм-аут, SqlConnectionString connectionOptions, Строка новый_пароль, Boolean redirectedUserInstance) в System.Data.SqlClient.SqlInternalConnectionTds..ctor (DbConnectionPoolIdentity идентичность, SqlConnectionString connectionOptions, Object providerInfo, String новый_пароль, SqlConnection owningObject, Boolean redirectedUserInstance) в System.Data.SqlClient.SqlConnectionFactory.CreateConnection (варианты DbConnectionOptions, Объект poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection) в System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection (DbConnection owningConnection, DbConnectionPoo l, параметры DbConnectionOptions) в System.Data.ProviderBase.DbConnectionPool.CreateObject (DbConnection owningObject) в System.Data.ProviderBase.DbConnectionPool.UserCreateRequest (DbConnection owningObject) в System.DataConnection OwningObject (DbConnection owningObject) в System.DataConnectionbject.ProviderObject. .Data.ProviderBase.DbConnectionFactory.GetConnection (DbConnection owningConnection) в System.Data.ProviderBase.DbConnectionClosed.OpenConnection (DbConnection externalConnection, DbConnectionFactory connectionFactory.DbConnectionFactory connectionFactory. OpenStoreConnectionIf (Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String TryptedOperation, Boolean & closeStoreConnectionOnFailure) --- Конец внутренней трассировки стека исключений --- в System.Data.EntityConnectionOnfailure, DbConnectionConnectionIntityConnectionIient.EntityConnectionOpenction (хранилище DbConnectionConnection, openConnectionIntityConnection (хранилище DbConnection), DbConnectionConnectionOpenConnection (DbConnectionIntityConnection) или iginalConnection, String excludedOperation, Boolean & closeStoreConnectionOnFailure) в System.Data.EntityClient.EntityConnection.Open () в System.Data.Objects.ObjectContext.EnsureConnection () в System.Data.Objects.ObjectQuery1.GetResults(Nullable1 forMergeOption) в System.Data.Objects.ObjectQuery1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() at System.Collections.Generic.List1..ctor (IEnumerable1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable
1 источник) System.Web.Mvc.ReflectedActionDescriptor.Execute (ControllerContext controllerContext, IDictionary2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary2) в System.Web.Mvc.ControllerActionInvoker. <> C__DisplayClass15.b__12 () в System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter (фильтр IActionFilter, предварительный контекст ActionExecutingContext, Func1 continuation) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList1, ActionDescriptor actionDescriptor, IDictionary`2 parameters) в System.Web.Mvc.ControllerActionInvoker.InvokeAction (ControllerContext controllerContext, String actionName)

Случаи возникновения этой ошибки связаны с запросами SELECT. Эти запросы выбора очень просты, т. Е.

Выберите col1, col2, col3 из таблицы, где col1 = 1

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

Я провел некоторое исследование этого, используя как Интернет и Переполнение стека. Некоторые предлагают увеличить dbContext CommandTimeout Собственность, однако я не понимаю, зачем мне это нужно. Да, если бы я извлекал множество записей, но, как я уже сказал, это простые ВЫБРАТЬ операторы, откатывающие максимум 1-5 записей.

Я также знаю, что разработчикам необходимо следить за SQL, генерируемым Entity Framework, поэтому я загрузил и запустил эту пробную версию. http://www.datawizard.com чтобы получить представление о SQL, создаваемом для запросов SELECT Entity Framework, которые вызывали проблему. Опять же, профилировщик показал, что эти запросы имеют очень простой синтаксис, поэтому я не думаю, что это проблема.

Я начинаю думать, что, может быть, это как-то связано с тем, что моя база данных и веб-приложение находятся на разных серверах, однако у меня нет идей!

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

Спасибо всем.

Чтобы устранить проблемы с клиентом или сетью, запустите полученный SQL в студии управления с включенной клиентской статистикой и наблюдайте за временем выполнения и усилиями, необходимыми для выполнения запроса.

Вы можете следовать запросу SELECT с помощью GO, чтобы выполнить его произвольное количество раз подряд, чтобы вы могли получить среднее значение по значимому набору образцов:

SELECT col1, col2, col3 FROM table WHERE something
GO 1000

Также учтите, что, поскольку такая структура скрывает большую часть, если не большую часть фактического SQL, не может быть реальной проблемой; возможно, он пытается массово распараллелить запрос или удерживает жесткую (исключительную чтение-запись) блокировку таблицы (таблиц) из-за задействованного ORM.

Из предоставленной вами трассировки стека это не тайм-аут команды, а скорее время соединения вышло (там такая строка: System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(...)). Это может быть известная ошибка в VS 2010, если вы используете зеркалирование, см. это сообщение в блоге для получения дополнительной информации.