Messages relatifs au dépassement du délai d’expiration lors de la connexion à SQL Server

S’applique à : SQL Server

Remarque

Avant de commencer à résoudre un problème, consultez les prérequis et parcourez la liste de vérification.

Une erreur de délai d’expiration signifie qu’une opération particulière prend plus de temps que nécessaire. L’application cliente arrête l’opération (au lieu d’attendre indéfiniment), ce qui peut bloquer d’autres opérations et suspendre une application. Cet article fournit des résolutions pour les erreurs « délai d’expiration de commande » et « délai de connexion » qui s’affichent lorsque vous vous connectez à SQL Server.

Vérifier les erreurs de dépassement du délai d’expiration

Lorsque vous rencontrez des problèmes de « dépassement du délai d’expiration », un ou plusieurs des messages d’erreur suivants s’affichent :

  • Délai d’attente expiré. Le délai d’expiration s’est produit avant la fin de l’opération ou le serveur ne répond pas.

  • System.Data.SqlClient.SqlException (0x80131904) : le délai d’attente pour la connexion a expiré. Le délai d’attente s’est écoulé lors de la tentative de consommation de l’accusé de réception de la poignée de main de préconnexion. Cela peut être dû à un échec de la poignée de main de préconnexion ou au fait que le serveur n’a pas pu répondre dans les temps. Le temps écoulé lors de la tentative de connexion à ce serveur était de [Préconnexion] initialisation = 23 ; poignée de main = 14979 ;
    System.ComponentModel.Win32Exception (0x80004005) : dépassement du délai d’attente.

  • System.Data.SqlClient.SqlException (0x80131904) : dépassement du délai d’expiration. Le délai d’expiration s’est produit avant la fin de l’opération ou le serveur ne répond pas. System.ComponentModel.Win32Exception (0x80004005) : dépassement du délai d’attente.

  • Le délai d’attente pour la connexion a expiré. Le délai d’attente s’est écoulé lors de la tentative de consommation de l’accusé de réception de la poignée de main de préconnexion. Cela peut être dû à un échec de la poignée de main de préconnexion ou au fait que le serveur n’a pas pu répondre dans les temps.
    Le temps écoulé lors de la tentative de connexion à ce serveur était de [Préconnexion] initialisation = 21036 ; poignée de main = 0 ; (Microsoft SQL Server, erreur : -2).

  • System.InvalidOperationException : dépassement du délai d’expiration. Le délai d’attente s’est écoulé avant l’obtention d’une connexion du pool.

    Si les connexions ne sont pas correctement fermées, des erreurs peuvent se produire. Ces erreurs se produisent car toutes les connexions regroupées sont utilisées et que la taille maximale du pool est atteinte. Vous pouvez éviter ces erreurs en suivant la procédure décrite dans l’article sur le pool de connexions épuisé.

Remarque

La deuxième et la troisième erreur se produisent lorsque .NET Framework 4.5 ou une version ultérieure est installé.

Déterminer le type d’erreurs de dépassement du délai d’expiration

Du point de vue de la connectivité, vous rencontrez les problèmes de délai d’expiration suivants :

  • Délai de connexion (15 secondes par défaut)
  • Délai d’expiration de la requête ou de la commande (30 secondes par défaut)

Remarque

Les valeurs par défaut peuvent être définies via un code, une chaîne de connexion ou d’autres méthodes.

Avant de résoudre les problèmes, affichez la pile des appels complète des messages d’erreur pour déterminer le type d’erreur.

  • Examinez l’exemple suivant de pile d’appels d’un délai de connexion :

    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 indique que le client tente d’ouvrir une connexion et n’est donc pas lié à une requête.

  • Examinez l’exemple suivant de pile d’appels d’un délai d’expiration de commande ou de requête :

    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 classe SqlCommand est utilisée pour travailler avec une requête, et non une connexion. La méthode ExecuteScalar est utilisée pour exécuter une requête. Vous pouvez également voir d’autres éléments, tels que ExecuteReader ou ExecuteNonQuery.

Résoudre les erreurs de dépassement du délai d’expiration

  • Si vous rencontrez une erreur de délai d’expiration de commande ou de requête, consultez l’article Résoudre les erreurs de délai d’expiration des requêtes.

  • Si vous rencontrez une erreur de délai de connexion, procédez comme suit :

    1. Augmentez le paramètre de délai de connexion.

      • Si vous utilisez une application pour vous connecter à SQL Server, augmentez les valeurs de paramètre de délai de connexion appropriées et vérifiez si la connexion réussit. Par exemple, si vous utilisez System.Data.SqlClient, définissez la propriété SqlConnection.ConnectionTimeout sur 30 ou sur une valeur plus élevée.

        Remarque

        Si vous utilisez d’autres fournisseurs, consultez la page d’accueil pour la programmation du client SQL.

      • Si vous utilisez SQL Server Management Studio (SSMS), sélectionnez l’onglet Propriétés de la connexion dans la boîte de dialogue Connexion au serveur et définissez le paramètre de délai de connexion sur une valeur plus élevée.

    2. Si la connexion réussit, il s’agit d’un problème de réseau. Vous devez collaborer avec votre administrateur réseau pour résoudre le problème. Une fois celui-ci résolu, vous pouvez revenir aux paramètres par défaut dans votre application.

      Remarque

      L’augmentation du délai de connexion dans l’application est une méthode possible, mais il ne s’agit pas d’une résolution à long terme. Cela est dû au fait que la connexion se produit rapidement (généralement en quelques millisecondes) lorsque vous essayez de vous connecter à une source de données.

Causes typiques et résolutions de l’erreur

Le tableau suivant répertorie les causes typiques et les résolutions des erreurs de dépassement du délai d’expiration. Pour plus d’informations et de suggestions, consultez la section Résolution des problèmes : dépassement du délai d’expiration.

Causes typiques Résolutions
Le nom du serveur a été entré de manière incorrecte. Réessayez avec le nom de serveur correct.
Le service SQL Server sur le serveur n’est pas en cours d’exécution. Démarrez l’instance du moteur de base de données SQL Server.
Le port TCP/IP de l’instance du moteur de base de données est bloqué par un pare-feu. Configurez le pare-feu pour autoriser l’accès au moteur de la base de données.
Le moteur de la base de données n’écoute pas sur le port 1433. Cela est dû au fait que le port a changé ou qu’il ne s’agit pas de l’instance par défaut et que le service SQL Server Browser n’est pas en cours d’exécution. Démarrez le service SQL Server Browser ou spécifiez un numéro de port TCP/IP pour une connexion à la commande Sqlcmd -S <ip_addres>,<port>. Dans le journal des erreurs, recherchez le numéro de port sur lequel SQL Server écoute.
Le service SQL Server Browser est en cours d’exécution, mais le port UDP 1434 est bloqué par un pare-feu. Configurez le pare-feu pour autoriser l’accès au port UDP 1434 sur le serveur ou spécifiez le numéro de port TCP/IP à connecter.
Le client et le serveur ne sont pas configurés pour utiliser le même protocole réseau. Assurez-vous que le serveur et les ordinateurs clients ont au moins un protocole activé en commun à l’aide du Gestionnaire de configuration SQL Server. Par exemple, si le client se connecte à l’aide de sockets TCP/IP, mais que SQL Server écoute uniquement sur des canaux nommés, aucune connectivité ne peut être établie.
Le réseau ne peut pas résoudre le nom du serveur en une adresse IP. Cela peut être testé à l’aide des programmes ping ou telnet. Corrigez le problème de résolution de noms d’ordinateur sur votre réseau ou connectez-vous au serveur à l’aide de l’adresse IP. Il ne s’agit pas d’un problème SQL Server. Pour obtenir de l’aide, consultez votre documentation Windows ou contactez votre administrateur réseau. Pour tester la connectivité, utilisez la commande suivante :
telnet <ServerName> [<Port>]
telnet <IP_Address> <Port>
Si l’utilisation d’une adresse IP fonctionne, mais que le nom du serveur ne fonctionne pas, il s’agit d’un problème de résolution de noms.
Le réseau ne peut pas se connecter à l’aide de l’adresse IP. Cela peut être testé à l’aide du programme ping, telnet ou tracert. Corrigez le problème TCP/IP sur votre réseau. Il ne s’agit pas d’un problème SQL Server. Pour obtenir de l’aide, consultez votre documentation Windows ou contactez votre administrateur réseau.
Pour une résolution plus avancée des problèmes réseau, consultez la section 0300 Problème réseau intermittent ou périodique.

Voir aussi