Tempo limite do SQL Server 2008 expirado

Tempo limite do SQL Server 2008 expirado

Fiz a pergunta abaixo no Stackoverflow sem nenhuma resposta, porém, alguém sugeriu que eu fizesse a pergunta também no serverfault. Espero que alguém possa ajudar.

Recentemente publiquei meu aplicativo da web ASP.Net MVC 3 (Entity Framework 4.1 para persistência de dados) em um servidor ativo. O aplicativo está localizado em um servidor web e o banco de dados (SQL Server 2008) está localizado em outro servidor separado.

O site está no ar há apenas alguns dias com poucos acessos e, por isso, há poucos registros contidos nas tabelas do banco de dados (10 a 20 no máximo).

Também tenho ELMAH (Error Logging Modules and Handlers for ASP.NET) integrado ao site e já recebi algumas instâncias do seguinte erro

System.Data.SqlClient.SqlException: Tempo limite expirou. O período de tempo limite decorrido antes da conclusão da operação ou o servidor não está respondendo.

Abaixo mostra os detalhes completos fornecidos pela ELMAH

System.Data.EntityException: o provedor subjacente falhou ao abrir. ---> System.Data.SqlClient.SqlException: Tempo limite expirou. O período de tempo limite decorrido antes da conclusão da operação ou o servidor não está respondendo. em System.Data.SqlClient.SqlInternalConnection.OnError (exceção SqlException, Boolean breakConnection) em System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() em System.Data.SqlClient.TdsParserStateObject.ReadSniError (TdsParserStateObject stateObj, erro UInt32) em System.Data .SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj) em System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket() em System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake (criptografia booleana, booleano trustServerCert, booleano& ) em System.Data. SqlClient.TdsParser.Connect (ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean IntegratedSecurity) em System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin (ServerInfo serverInfo, String newPass palavra, booleano ignoreSniOpenTimeout, tempo limite de TimeoutTimer, SqlConnection owningObject) em System.Data.SqlClient.SqlInternalConnectionTds.LoginWithFailover (Boolean useFailoverHost, ServerInfo primárioServerInfo, String failoverHost, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, conexões SqlConnectionString, TimeoutTimer timeout) em System.Data.SqlClient.SqlInternalConnection Tds.OpenLoginEnlist(SqlConnection Propriedade do Timeouttimer Timeout, SQLConnectionString ConnectionOptions, String NewPassword, Boolean RedirectedUserInstance) em System.data.sqlclient.sqlinernalConnectionTds postura) em system.data.sqlclient . .CreateObject(DbConnection ownObject ) em System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject) em System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) em System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) em System.Data.ProviderBase. DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) em System.Data.SqlClient.SqlConnection.Open() em System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf (Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceçãoCode, String TentatedOperation, Boolean& closeStoreConnectionOnFailure) --- Fim do rastreamento de pilha de exceção interna --- em System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf (Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceçãoCode, String tentadoOperation, Boolean& closeStoreConnectionOnFailure) em System.Data.EntityClient.EntityConnection.Open() em System.Data.Objects.ObjectContext.EnsureConnection() em System.Data.Objects.ObjectQuery1.GetResults(Nullable1 forMergeOption) em System.Data.Objects.ObjectQuery 1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() at System.Collections.Generic.List1..ctor ( fonte IEnumerable 1) System.Web.Mvc.ReflectedActionDescriptor.Execute (ControllerContext controllerContext, parâmetros IDictionary 2) em System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15. b__12() em System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter (filtro IActionFilter, ActionExecutingContext preContext, filtros Func 1, ActionDescriptor actionDescriptor, parâmetros IDictionary`2) em System.Web.Mvc.ControllerActionInvoker.InvokeAction (ControllerContext controllerContext, String 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

As ocasiões em que esse erro ocorreu foram devido a consultas SELECT. Essas consultas selecionadas são muito simples, ou seja,

Selecione col1, col2, col3 da tabela onde col1 = 1

E como afirmei, há muito poucos dados no banco de dados, então não é como se as consultas estivessem recuperando centenas de registros.

Eu fiz algumas pesquisas sobre isso usando tanto oInterneteStackoverflow. Algumas pessoas sugerem aumentar odbContext CommandTimeoutPropriedade, no entanto, não entendo por que preciso fazer isso. Sim, se eu estivesse recuperando um monte de registros, mas como eu disse, estes são simplesSELECIONARdeclarações recuperando de 1 a 5 registros no máximo.

Também sei que os desenvolvedores precisam ficar de olho no SQL gerado pelo Entity Framework, então baixei e executei esta versão de testehttp://www.datawizard.compara dar uma olhada no SQL que está sendo criado para as consultas SELECT do Entity Framework que estavam causando o problema. Novamente, o criador de perfil mostrou que essas consultas têm uma sintaxe muito simples, então não acho que esse seja o problema.

Estou começando a pensar que talvez tenha algo a ver com meu banco de dados e aplicativo da web estarem em servidores separados, no entanto, estou sem ideias!

Por favor, se alguém puder me ajudar ou aconselhar com esse problema, ficaria muito grato.

Obrigado a todos.

Responder1

Para eliminar problemas de cliente ou de rede, execute o SQL resultante em um estúdio de gerenciamento com as estatísticas do cliente habilitadas e observe os tempos de execução e o esforço necessário para executar a consulta.

Você pode seguir a consulta SELECT com GO para executá-la um número arbitrário de vezes consecutivas, para obter uma média de um conjunto de amostras significativo:

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

Considere também que, uma vez que tal estrutura oculta muito, se não a maior parte, do SQL real, esse pode não ser o problema real; talvez ele tente paralelizar massivamente a consulta ou mantenha um bloqueio rígido (leitura e gravação exclusiva) na(s) tabela(s) devido ao ORM envolvido.

Responder2

Pelo stacktrace que você forneceu, este não é um tempo limite de comando, mas sim umtempo limite de conexão(há esta linha: System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(...)). Este pode ser um bug conhecido no VS 2010, se você estiver usando espelhamento, consulteesta postagem do blog para mais informações.

informação relacionada