Mensajes de tiempo de espera agotado al conectarse a SQL Server
Se aplica a: SQL Server
Nota:
Antes de empezar a solucionar problemas, consulte los requisitos previos y siga la lista de comprobación.
Un error de tiempo de espera significa que una operación determinada tarda más de lo necesario. La aplicación cliente detiene la operación (en lugar de esperar indefinidamente), lo que puede bloquear otras operaciones y suspender una aplicación. En este artículo se proporcionan soluciones para los errores "command-timeout" y "connection-timeout" que recibe al conectarse a SQL Server.
Comprobación de errores de tiempo de espera agotado
Cuando se producen errores de "tiempo de espera agotado", recibe uno o varios de los siguientes mensajes de error:
-
Se agotó el tiempo de espera. El período de tiempo de espera se agotó antes de la finalización de la operación o el servidor no responde.
-
System.Data.SqlClient.SqlException (0x80131904): tiempo de espera de conexión agotado. El período de tiempo de espera transcurrido al intentar consumir la confirmación del protocolo de enlace previo al inicio de sesión. Esto podría deberse a que se produjo un error en el protocolo de enlace anterior al inicio de sesión o que el servidor no pudo responder a tiempo. La duración del intento de conexión a este servidor fue [Pre-Login] initialization=23; handshake=14979;
System.ComponentModel.Win32Exception (0x80004005): Tiempo de espera de la operación de espera agotado. -
System.Data.SqlClient.SqlException (0x80131904): Tiempo de espera agotado. El período de tiempo de espera se agotó antes de la finalización de la operación o el servidor no responde. System.ComponentModel.Win32Exception (0x80004005): Tiempo de espera de la operación de espera agotado.
-
Tiempo de espera de conexión agotado El período de tiempo de espera transcurrido al intentar consumir la confirmación del protocolo de enlace anterior al inicio de sesión. Esto podría deberse a que se produjo un error en el protocolo de enlace previo al inicio de sesión o que el servidor no pudo responder a tiempo.
La duración del intento de conexión a este servidor fue [Pre-Login] initialization=21036; handshake=0; (Microsoft SQL Server, Error: -2). -
System.InvalidOperationException: Tiempo de espera agotado. El periodo de espera se agotó antes de obtener una conexión del grupo.
Si las conexiones no se cierran correctamente, pueden producirse errores. Estos errores se producen porque todas las conexiones agrupadas están en uso y se alcanza el tamaño máximo del grupo. Puede evitar estos errores si sigue los pasos descritos en el artículo grupo de conexiones agotado.
Nota:
El segundo y el tercer error se producen cuando se instala .NET Framework 4.5 o una versión posterior.
Determinar el tipo de errores de tiempo de espera agotado
Desde una perspectiva de conectividad, se producen los siguientes problemas de tiempo de espera:
- Tiempo de espera de conexión (15 segundos de forma predeterminada)
- Tiempo de espera de consulta o comando (30 segundos de forma predeterminada)
Nota:
Los valores predeterminados se pueden establecer mediante código, cadena de conexión u otros métodos.
Antes de solucionar problemas, consulte la pila de llamadas completa de los mensajes de error para determinar el tipo de error.
Consulte el ejemplo siguiente de una pila de llamadas de tiempo de espera de conexión:
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(TdsParserStateObject stateObj) 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, SqlConnectionowningObject) at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfoserverInfo, String newPassword, Boolean ignoreSniOpenTimeout, Int64 timerExpire, SqlConnection owningObject) at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(String host, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, Int64 timerStart) at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, 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()
SqlConnection.Open
indica que el cliente está intentando abrir una conexión y, por lo tanto, no está relacionado con una consulta.Consulte el ejemplo siguiente de una pila de llamadas de tiempo de espera de consulta o comando:
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.SqlConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) at System.Data.SqlClient.SqlDataReader.ConsumeMetaData() at System.Data.SqlClient.SqlDataReader.get_MetaData() at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) at System.Data.SqlClient.SqlCommand.ExecuteScalar()
La clase
SqlCommand
se usa para trabajar con una consulta, no con una conexión. El métodoExecuteScalar
se usa para ejecutar una consulta. También puede ver otros elementos, comoExecuteReader
oExecuteNonQuery
.
Solución de problemas de errores de tiempo de espera agotado
Si encuentra un error de tiempo de espera de consulta o de comando, consulte Solución de problemas de tiempo de espera de consulta.
Si encuentra un error de tiempo de espera de conexión, haga lo siguiente:
Aumente el parámetro connection-timeout.
Si usa una aplicación para conectarse a SQL Server, aumente los valores de parámetro de tiempo de espera de conexión pertinentes y compruebe si la conexión finalmente se realiza con éxito. Por ejemplo, si usa
System.Data.SqlClient
, establezca la propiedad SqlConnection.ConnectionTimeout en 30 o un valor superior.Nota:
Si usa otros proveedores, consulte Página principal para la programación del cliente SQL.
Si usa SQL Server Management Studio (SSMS), seleccione la pestaña Propiedades de conexión en el cuadro de diálogo Conectar al servidor y establezca el Tiempo de espera de conexión en un valor superior.
Si la conexión finalmente es correcta, se trata de un problema de red. Debe trabajar con el administrador de red para resolver el problema. Una vez solucionado, puede volver a la configuración predeterminada de la aplicación.
Nota:
Aumentar el tiempo de espera de conexión en la aplicación es un posible método, pero no es una resolución a largo plazo. Esto se debe a que la conexión se produce rápido (normalmente en unos milisegundos) al intentar conectarse a un origen de datos.
Causas y resoluciones típicas del error
En la tabla siguiente, se enumeran las causas y las resoluciones típicas de los errores de tiempo de espera expirado. Para obtener más consejos y sugerencias, consulte Solución de problemas: tiempo de espera expirado.
Causas típicas | Soluciones |
---|---|
El nombre del servidor se escribió de forma incorrecta. | Vuelva a intentarlo con el nombre correcto. |
El servicio SQL Server en el servidor no se está ejecutando. | Inicie la instancia del motor de base de datos de SQL Server. |
Un firewall bloquea el puerto TCP/IP de la instancia del motor de base de datos. | Configure el firewall para permitir el acceso al motor de base de datos. |
El motor de base de datos no escucha en el puerto 1433. Esto se debe a que el puerto cambia o no es la instancia predeterminada y el servicio SQL Server Browser no se está ejecutando. | Inicie el servicio SQL Server Browser o especifique un número de puerto TCP/IP para conectarse con el comando Sqlcmd -S <ip_addres>,<port> . En el registro de errores, busque el número de puerto en el que está escuchando SQL Server. |
El servicio SQL Server Browser se está ejecutando, pero un firewall bloquea el puerto UDP 1434. | Configure el firewall para permitir el acceso al puerto UPD 1434 en el servidor o especifique el número de puerto TCP/IP para conectarse. |
El cliente y el servidor no están configurados para usar el mismo protocolo de red. | Asegúrese de que el servidor y los equipos cliente tengan al menos un protocolo habilitado en común mediante el Administrador de configuración de SQL Server. Por ejemplo, si el cliente se conecta mediante sockets TCP/IP, pero SQL Server solo escucha en canalizaciones con nombre, no se puede establecer ninguna conectividad. |
La red no puede resolver el nombre del servidor en una dirección IP; esto se puede probar mediante los programas ping o telnet. | Corrija el problema de resolución de nombres del equipo en la red o conéctese al servidor mediante la dirección IP; esto no es un problema de SQL Server. Para obtener ayuda, consulte la documentación de Windows o póngase en contacto con el administrador de red. Utilice el comando siguiente para probar la conectividad:telnet <ServerName> [<Port>] telnet <IP_Address> <Port> Si el uso de una dirección IP funciona, pero el nombre del servidor no, es un problema de resolución de nombres. |
La red no se puede conectar mediante la dirección IP; esto se puede probar mediante el programa ping, telnet o tracert. | Corrija el problema de TCP/IP en la red; esto no es un problema de SQL Server. Para obtener ayuda, consulte la documentación de Windows o póngase en contacto con el administrador de red. Para una solución de problemas de red más avanzada, consulte Problema de red intermitente o periódico 0300. |