Délai d’expiration des messages lors de la connexion à SQL Server
S'applique à : SQL Server
Note
Avant de commencer la résolution des problèmes, vérifiez les prérequis et passez par la liste de contrôle.
Une erreur de délai d’expiration signifie qu’une certaine opération 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 d’expiration de connexion » que vous recevez lorsque vous vous connectez à SQL Server.
Vérifier que les erreurs de délai d’expiration ont expiré
Lorsque vous rencontrez des problèmes d’expiration du délai d’expiration, vous recevez un ou plusieurs des messages d’erreur suivants :
-
Délai expiré. Période de délai d’attente écoulée avant l’achèvement de l’opération, ou le serveur ne répond pas.
-
System.Data.SqlClient.SqlException (0x80131904) : expiration du délai d’expiration de la connexion. Le délai d’attente a expiré lors de la tentative d’utilisation de l’accusé de réception de la négociation de préconnexion. Cela peut être dû au fait que la négociation de préconnexion a échoué, ou que le serveur n’a pas pu répondre à temps. Le temps écoulé lors de la tentative de connexion à ce serveur était de - [Préconnexion] initialisation=23 ; établissement d’une liaison=14979 ;
System.ComponentModel.Win32Exception (0x80004005) : L’opération d’attente a expiré. -
System.Data.SqlClient.SqlException (0x80131904) : expiration du délai d’expiration. Période de délai d’attente écoulée avant l’achèvement de l’opération, ou le serveur ne répond pas. System.ComponentModel.Win32Exception (0x80004005) : L’opération d’attente a expiré.
-
Délai d’expiration de la connexion dépassé Le délai d’attente a expiré lors de la tentative d’utilisation de l’accusé de réception de la négociation de préconnexion. Cela peut être dû au fait que la négociation de préconnexion a échoué, ou que le serveur n’a pas pu répondre à temps.
La durée passée lors de la tentative de connexion à ce serveur était [pré-connexion] initialisation=21036 ; négociation=0 ; (Microsoft SQL Server, Erreur : -2). -
System.InvalidOperationException : expiration du délai d’expiration. Le période de délai d’expiration s’est écoulée avant l’obtention d’une connexion à partir du pool.
Si les connexions ne sont pas fermées correctement, des erreurs peuvent se produire. Ces erreurs se produisent parce que toutes les connexions mises en pool sont utilisées et que la taille maximale du pool est atteinte. Vous pouvez éviter ces erreurs si vous suivez les étapes décrites dans l’article épuisé du pool de connexions.
Note
La deuxième et la troisième erreur se produisent lorsque .NET Framework 4.5 ou une version ultérieure est installée.
Déterminer le type d’erreurs d’expiration 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 d’expiration de la connexion (15 secondes par défaut)
- Délai d’expiration des requêtes ou commandes (30 secondes par défaut)
Note
Les valeurs par défaut peuvent être définies par le biais du code, de la connexion de chaînes ou d’autres méthodes.
Avant de résoudre les problèmes, affichez la pile d’appels complète des messages d’erreur pour déterminer le type d’erreur.
Consultez l’exemple suivant d’une pile d’appels d’un délai d’expiration 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.Consultez l’exemple suivant d’une pile d’appels d’une requête ou d’un délai d’expiration de commande :
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
SqlCommand
classe est utilisée pour utiliser une requête, et non une connexion. LaExecuteScalar
méthode est utilisée pour exécuter une requête. Vous pouvez également voir d’autres éléments, tels qu’unExecuteReader
ouExecuteNonQuery
.
Résoudre les erreurs de délai d’expiration expirées
Si vous rencontrez une erreur de délai d’attente de requête ou de commande, consultez Résoudre les erreurs de délai d’expiration des requêtes.
Si vous rencontrez une erreur de délai d’expiration de connexion, procédez comme suit :
Augmentez le paramètre de délai d’expiration de connexion.
Si vous utilisez une application pour vous connecter à SQL Server, augmentez les valeurs de paramètre de délai d’expiration 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 une valeur supérieure.Note
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 connexion dans la boîte de dialogue Se connecter au serveur et définissez le paramètre délai d’expiration de connexion sur une valeur supérieure.
Si la connexion réussit, il s’agit d’un problème réseau. Vous devez travailler avec votre administrateur réseau pour résoudre le problème. Une fois qu’elle a été résolue, vous pouvez rétablir les paramètres par défaut dans votre application.
Note
L’augmentation du délai d’expiration de la connexion dans l’application est une méthode possible, mais elle n’est pas 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 et résolutions typiques de l’erreur
Le tableau suivant répertorie les causes et résolutions classiques pour les erreurs expirées de délai d’expiration. Pour obtenir d’autres conseils et suggestions, consultez Résolution des problèmes : Expiration du délai d’expiration.
Causes typiques | Résolutions |
---|---|
Le nom du serveur a été tapé de manière incorrecte. | Réessayez avec le nom correct du serveur. |
Le service SQL Server sur le serveur n’est pas en cours d’exécution. | Démarrez l’instance de SQL Server Moteur de base de données. |
Le port TCP/IP de l’instance Moteur de base de données est bloqué par un pare-feu. | Configurez le pare-feu pour autoriser l’accès au Moteur de base de données. |
La Moteur de base de données n’écoute pas sur le port 1433. Cela est dû au fait que le port est modifié ou qu’il n’est pas 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 vous connecter à la Sqlcmd -S <ip_addres>,<port> commande. 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 UPD 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 de 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 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, ce n’est pas un problème SQL Server. Pour obtenir de l’aide, consultez votre documentation Windows ou contactez votre administrateur réseau. Utilisez la commande suivante pour tester la connectivité :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 tracet . | Corrigez le problème TCP/IP sur votre réseau, ce n’est pas un problème SQL Server. Pour obtenir de l’aide, consultez votre documentation Windows ou contactez votre administrateur réseau. Pour une résolution des problèmes réseau plus avancée, consultez 0300 Problème de réseau intermittent ou périodique. |