El tiempo de espera de SQL Server 2008 expiró

El tiempo de espera de SQL Server 2008 expiró

Hice la siguiente pregunta en Stackoverflow sin ninguna respuesta, sin embargo, alguien sugirió que también hiciera la pregunta en serverfault. Ojalá alguien pueda ayudar.

Recientemente publiqué mi aplicación web ASP.Net MVC 3 (Entity Framework 4.1 para persistencia de datos) en un servidor en vivo. La aplicación está ubicada en un servidor web y la base de datos (SQL Server 2008) está ubicada en otro servidor independiente.

El sitio solo ha estado activo unos pocos días con muy pocas visitas y debido a esto, hay muy pocos registros contenidos en las tablas de la base de datos (10-20 como máximo).

También tengo ELMAH (Módulos y controladores de registro de errores para ASP.NET) integrado en el sitio y ya he recibido algunos casos del siguiente error

System.Data.SqlClient.SqlException: el tiempo de espera expiró. El período de tiempo de espera ha transcurrido antes de completar la operación o el servidor no responde.

A continuación se muestran todos los detalles proporcionados por ELMAH.

System.Data.EntityException: el proveedor subyacente falló al abrir. ---> System.Data.SqlClient.SqlException: el tiempo de espera expiró. El período de tiempo de espera ha transcurrido antes de completar la operación o el servidor no responde. en System.Data.SqlClient.SqlInternalConnection.OnError (excepción SqlException, conexión booleana) en System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() en System.Data.SqlClient.TdsParserStateObject.ReadSniError (TdsParserStateObject stateObj, error UInt32) en System.Data .SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj) en System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket() en System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(Cifrado booleano, TrustServerCert booleano, Boolean& Capaz) en System.Data. SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean TrustServerCert, Boolean IntegratedSecurity) en System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, lean ignoreSniOpenTimeout, TimeoutTimer tiempo de espera, SqlConnection owningObject) en System.Data.SqlClient.SqlInternalConnectionTds.LoginWithFailover (uso booleanoFailoverHost, ServerInfo primarioServerInfo, String failoverHost, String newPassword, booleano redireccionadoUserInstance, SqlConnection ownObject, SqlConnectionString connectOptions, TimeoutTimer timeout) en System.Data.SqlClient.SqlInternal ConexiónTds.OpenLoginEnlist(SqlConnection owningObject, TimeoutTimer timeout, SqlConnectionString connectOptions, String newPassword, booleano redireccionadoUserInstance) en System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identidad, SqlConnectionString connectOptions, Object ProviderInfo, String newPassword, SqlConnection owningObject, booleano redireccionadoUserInstance) en System.Data. Cliente SQL .SqlConnectionFactory.CreateConnection (opciones de DbConnectionOptions, grupo de objetosGroupProviderInfo, grupo de DbConnectionPool, grupo de DbConnection ownConnection) en System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection (conexión de propietario de DbConnection, grupo de DbConnectionPool, opciones de DbConnectionOptions) en System.Data.ProviderBase.DbConnectionPool.CreateObject (Objeto propietario de la conexión Db ) en System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject) en System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) en System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection ownConnection) en System.Data.ProviderBase. DbConnectionClosed.OpenConnection(DbConnection externalConnection, DbConnectionFactory ConnectionFactory) en System.Data.SqlClient.SqlConnection.Open() en System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String excepciónCode, String intentOperation, Boolean& closeStoreConnectionOnFailure) --- Fin del seguimiento de la pila de excepción interna --- en System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection conexión original, código de excepción de cadena, operación intentada de cadena, booleano y closeStoreConnectionOnFailure) en System.Data.EntityClient.EntityConnection.Open() en System.Data.Objects.ObjectContext.EnsureConnection() en System.Data.Objects.ObjectQuery1.GetResults(Nullable1 paraMergeOption) en System.Data.Objects.ObjectQuery 1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() at System.Collections.Generic.List1..ctor( fuente IEnumerable 1) System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controladorContext, IDictionary 2 parámetros) en System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15. b__12() en System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(filtro IActionFilter, preContext ActionExecutingContext, filtros Func 1, ActionDescriptor actionDescriptor, parámetros IDictionary`2) en System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controladorContext, 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

Las ocasiones en las que ha ocurrido este error se han debido a consultas SELECT. Estas consultas de selección son muy simples, es decir,

Seleccione col1, col2, col3 de la tabla donde col1 = 1

Y como he dicho, hay muy pocos datos dentro de la base de datos, por lo que no es como si las consultas estuvieran recuperando cientos de registros.

He investigado un poco sobre esto utilizando tanto elInternetyDesbordamiento de pila. Algunas personas sugieren aumentar elTiempo de espera del comando dbContextPropiedad, sin embargo, no entiendo por qué debería hacer esto. Sí, si estuviera recuperando un montón de registros, pero como he dicho, estos son simplesSELECCIONARdeclaraciones que retiran de 1 a 5 registros como máximo.

También sé que los desarrolladores deben estar atentos al SQL generado por Entity Framework, así que descargué y ejecuté esta versión de prueba.http://www.datawizard.compara poder ver el SQL que se está creando para las consultas SELECT de Entity Framework que estaban causando un problema. Nuevamente, el generador de perfiles mostró que estas consultas tenían una sintaxis muy simple, por lo que no creo que ese sea el problema.

Estoy empezando a pensar que tal vez tenga algo que ver con que mi base de datos y mi aplicación web estén en servidores separados, sin embargo, ¡se me acabaron las ideas!

Por favor, si alguien puede ayudarme o aconsejarme con este problema, se lo agradecería mucho.

Gracias a todos.

Respuesta1

Para eliminar problemas del cliente o de la red, ejecute el SQL resultante en un estudio de administración con las estadísticas del cliente habilitadas y observe los tiempos de ejecución y el esfuerzo requerido para ejecutar la consulta.

Puede seguir la consulta SELECT con GO para ejecutarla un número arbitrario de veces seguidas, de modo que pueda obtener un promedio de un conjunto de muestra significativo:

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

También considere que, dado que dicho marco oculta gran parte, si no la mayor parte, del SQL real a la vista, ese puede no ser el problema real; tal vez intenta paralelizar masivamente la consulta, o mantiene un bloqueo duro (exclusivo de lectura y escritura) en las tablas debido al ORM involucrado.

Respuesta2

Según el seguimiento de pila que proporcionó, esto no es un tiempo de espera de comando, sino más bien unel tiempo de conexión expiro(hay esta línea System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(...):). Esto podría ser un error conocido en VS 2010; si está utilizando la duplicación, consulteesta publicación de blog para más información.

información relacionada