Время ожидания SQL Server 2008 истекло
Я задал вопрос ниже по Stackoverflow без каких-либо ответов, однако кто-то предложил мне также задать вопрос по serverfault. Надеюсь, кто-то может помочь.
Недавно я опубликовал свое веб-приложение 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.TdsParserStateObjectOat.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult AsyncResult, TdsParserStateObject stateObj) в System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket() в System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(Boolean шифровать, булева trustServerCert, булева & marsCapable) при System.Data.SqlClient.TdsParser.Connect(serverInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean шифровать, Boolean trustServerCert, Boolean integratedSecurity) в System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin (serverInfo serverInfo, Струнный новый_пароль, Boolean ignoreSniOpenTimeout, TimeoutTimer тайм-аут, SqlConnection owningObject) в System.Data.SqlClient.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, Строка newPassword, Boolean redirectedUserInstance) в System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnectionConnect.OnConnect_Connect.Confision_Connect.Confision_Connect.Confision_Conject.Connect_Conject.Connect_Conject.Conject_Conject.Connect_Connect.Confision_Conject_Conject.Conject_Conject_Conject_Conject.Connect_setup.Conject_Conject_Conject.C ф_переключение. Объект poolGroupProviderInfo, пул DbConnectionPool, 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.Data.bob.Connect.Data.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String trytedOperation, Boolean& closeStoreConnectionOnFailure) --- Конец внутренней трассировки стека исключений --- в System.Data.EntityClient.EntityConnectionOnectionConnectionOnectionConnectionOnectionConnectionOnectionConnectionOnectionConnectionOnectionConnectionOnectionConnectionOnectionConnectionOnectionConnectionOnectionConnectionOction.exe или же iginalConnection, String exceptionCode, String предпринимаемые Operation, Boolean & closeStoreConnectionOnFailure) в System.Data.EntityClient.EntityConnection.Open() в System.Data.Objects.ObjectContext.EnsureConnection() в System.Data.Objects.ObQu
1.GetResults(Nullable
1 forMergeOption) в System.Data.Objects.ObjectQuery1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() at System.Collections.Generic.List
1..ctor (IEnumerable1 collection)
1 источник) System.Web.Mvc.ReflectedActionDescriptor.Execute (ControllerContext controllerContext, IDictionary
at System.Linq.Enumerable.ToList[TSource](IEnumerable2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary
2 параметра) в 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, IList
1 фильтр, ActionDescriptor actionDescriptor, параметры IDictionary`2) в System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName)
Случаи, когда произошла эта ошибка, были вызваны запросами SELECT. Эти запросы выбора очень просты, т.е.
Выберите col1, col2, col3 из таблицы, где col1 = 1
И, как я уже говорил, в базе данных очень мало данных, поэтому запросы не отбрасывают сотни записей.
Я провел некоторые исследования в этой области с использованием Интернета и Stackoverflow. Некоторые люди предлагают увеличить свойство CommandTimeout dbContext, однако я не понимаю, зачем мне это нужно. Да, если бы я собирал кучу записей, но, как я уже сказал, это простые операторы SELECT, которые максимально вытягивают 1-5 записей.
Я также знаю, что разработчики должны следить за SQL, генерируемым Entity Framework, поэтому я скачал и запустил пробную версию http://www.datawizard.com/, чтобы взглянуть на SQL, создаваемый для Entity Framework SELECT запросов, которые вызывали проблему. Опять же, профилировщик показал, что эти запросы имеют очень простой синтаксис, поэтому я не думаю, что это проблема.
Я начинаю думать, что, возможно, это как-то связано с тем, что моя база данных и веб-приложение находятся на разных серверах, но у меня нет идей!
Пожалуйста, если кто-то может помочь или посоветовать мне в этом вопросе, это будет с благодарностью.
Спасибо всем.
2 ответа
Чтобы устранить проблемы с клиентом или сетью, запустите полученный SQL-запрос в студии управления с включенной статистикой клиента и просмотрите время выполнения и усилия, необходимые для выполнения запроса.
Вы можете выполнить запрос SELECT с помощью GO, чтобы выполнить его произвольное число раз подряд, чтобы получить среднее значение по значимому набору выборок:
SELECT col1, col2, col3 FROM table WHERE something
GO 1000
Также учтите, что, поскольку такая структура скрывает много, если не большую часть реального SQL, это не может быть реальной проблемой; возможно, он пытается массово распараллелить запрос, или он удерживает жесткую (исключительную чтение-запись) блокировку таблиц из-за вовлеченности ORM.
Из предоставленной вами трассировки стека это не тайм-аут команды, а тайм-аут соединения (есть такая строка: System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(...)
). Это может быть известной ошибкой в VS 2010, если вы используете зеркалирование, см. Этот пост в блоге для получения дополнительной информации.