O tempo limite do SQL Server 2008 expirou

1

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

Eu publiquei recentemente 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 da Web e o banco de dados (SQL Server 2008) está localizado em outro servidor separado.

O site tem apenas alguns dias de vida com pouquíssimos acessos e, por isso, há poucos registros contidos nas tabelas do banco de dados (máximo de 10 a 20).

Eu também tenho o ELMAH (Módulos de registro de erros e manipuladores para o ASP.NET) integrado ao site e já recebi algumas instâncias do seguinte erro

System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

Abaixo, os detalhes completos fornecidos pela ELMAH

System.Data.EntityException: The underlying provider failed on Open. ---> System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error) at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj) at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket() at System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(Boolean encrypt, Boolean trustServerCert, Boolean& marsCapable) at System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity) at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, SqlConnection owningObject) at System.Data.SqlClient.SqlInternalConnectionTds.LoginWithFailover(Boolean useFailoverHost, ServerInfo primaryServerInfo, String failoverHost, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, TimeoutTimer timeout) at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, TimeoutTimer timeout, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance) at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance) at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection) at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options) at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject) at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject) at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) at System.Data.SqlClient.SqlConnection.Open() at System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure) --- End of inner exception stack trace --- at System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure) at System.Data.EntityClient.EntityConnection.Open() at System.Data.Objects.ObjectContext.EnsureConnection() at System.Data.Objects.ObjectQuery1.GetResults(Nullable1 forMergeOption) at 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 source) System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary2 parameters) at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.b__12() at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func1 continuation) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList1 filters, ActionDescriptor actionDescriptor, IDictionary'2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName)

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

Select col1, col2, col3 from table where col1 = 1

E, como afirmei, há muito poucos dados no banco de dados, por isso, não é como se as consultas estivessem puxando para trás 100 registros.

Eu fiz algumas pesquisas sobre isso usando o Internet e o Stackoverflow . Algumas pessoas sugerem aumentar a propriedade dbContext CommandTimeout , no entanto, não entendo por que preciso fazer isso. Sim, se eu estivesse recuperando muitos registros, mas como eu disse, essas são instruções simples SELECT retornando de 1 a 5 registros no máximo.

Eu 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 teste link para dar uma olhada no SQL sendo criado para as consultas SELECT do Entity Framework que estavam causando um problema. Novamente, o criador de perfil mostrou que essas consultas são muito simples, então não acho que seja esse o problema.

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

Por favor, se alguém puder me ajudar ou aconselhar-me com esta questão, será muito apreciado.

Obrigado a todos.

    
por tcode 24.08.2012 / 14:55

2 respostas

1

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

Você pode seguir a consulta SELECT com GO para executá-lo um número arbitrário de vezes sucessivas, para que você possa obter uma média sobre um conjunto de amostras significativo:

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

Considere também que, uma vez que tal framework esconde muito, senão a maioria, do SQL real, esse pode não ser o problema real; talvez ele tente paralelizar massivamente a consulta, ou ela detém um bloqueio difícil (leitura-gravação exclusiva) na (s) tabela (s) devido ao ORM envolvido.

    
por 24.08.2012 / 15:02
0

No stacktrace que você forneceu, este não é um tempo limite de comando, mas sim um tempo limite de conexão (existe essa linha: System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(...) ). Isso pode ser um bug conhecido no VS 2010, se você estiver usando o espelhamento, consulte este post para mais informações .

    
por 13.11.2014 / 18:32