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

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

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

Недавно я опубликовал свое веб-приложение ASP.Net MVC 3 (Entity Framework 4.1 for Data Persistence) на рабочем сервере. Приложение расположено на одном веб-сервере, а база данных (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.ReadSniError(состояние TdsParserStateObjectObj, ошибка UInt32) в System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, состояние TdsParserStateObjectObj) в System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket() в System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(логическое шифрование, логическое trustServerCert, логическое& marsCapable) в System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity) в System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, SqlConnection owningObject) в System.Data.SqlClient.SqlInternalConnectionTds.LoginWithFailover(Boolean useFailoverHost, ServerInfo primaryServerInfo, String failoverHost, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, TimeoutTimer тайм-аут) в System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection ownedObject, TimeoutTimer тайм-аут, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance) в System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection ownedObject, Boolean redirectedUserInstance) в System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection) в System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options) в System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject) в System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject) в System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) в System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) в System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outsideConnection, DbConnectionFactory connectionFactory) в System.Data.SqlClient.SqlConnection.Open() в System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure) --- Конец трассировки внутреннего стека исключений --- в System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure) в System.Data.EntityClient.EntityConnection.Open() в System.Data.Objects.ObjectContext.EnsureConnection() в System.Data.Objects.ObjectQuery1.GetResults(Nullable1 forMergeOption) в System.Data.Objects.ObjectQuery 1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() at System.Collections.Generic.List1..ctor(источник IEnumerable 1) System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, параметры IDictionary 2) в System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.b__12() в System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(фильтр IActionFilter, предварительный контекст ActionExecutingContext, фильтры Func 1, дескриптор действия actionDescriptor, параметры IDictionary`2) в System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, строка actionName)1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable
2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary1 continuation) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList

Случаи, когда эта ошибка происходила, были из-за запросов SELECT. Эти запросы select очень просты, т.е.

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

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

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

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

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

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

Всем спасибо.

решение1

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

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

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

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

решение2

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

Связанный контент