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(Nullable
1
forMergeOption) at
System.Data.Objects.ObjectQuery1.System.Collections.Generic.IEnumerable<T>.GetEnumerator()
at System.Collections.Generic.List
1..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, IDictionary
2
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, IList
1 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.