Время ожидания 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.ObQu1.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, Func 1 continuation) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList1 фильтр, 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, если вы используете зеркалирование, см. Этот пост в блоге для получения дополнительной информации.

Другие вопросы по тегам