CORRECTIF : Erreur de temporisation lorsqu'une connexion de base de données miroir est créée par le fournisseur de données.NET Framework pour SQLClient

Extended support for SQL Server 2005 ended on April 12, 2016

If you are still running SQL Server 2005, you will no longer receive security updates and technical support. We recommend upgrading to SQL Server 2014 and Azure SQL Database to achieve breakthrough performance, maintain security and compliance, and optimize your data platform infrastructure. Learn more about the options for upgrading from SQL Server 2005 to a supported version here.

IMPORTANT : Cet article est issu d'une traduction automatique réalisée par un logiciel Microsoft et non par un traducteur professionnel. Cette traduction automatique a pu aussi être révisée par la communauté Microsoft grâce à la technologie Community Translation Framework (CTF). Pour en savoir plus sur cette technologie, veuillez consulter la page http://support.microsoft.com/gp/machine-translation-corrections/fr. Microsoft vous propose en effet des articles traduits par des professionnels, des articles issus de traductions automatiques et des articles issus de traductions automatiques révisées par la communauté Microsoft, de manière à ce que vous ayez accès à tous les articles de notre Base de connaissances dans votre langue. Il est important de noter que les articles issus de la traduction automatique, y compris ceux révisés par la communauté Microsoft, peuvent contenir des erreurs de vocabulaire, de syntaxe ou de grammaire. Microsoft ne pourra être tenu responsable des imprécisions, erreurs, ainsi que de tout dommage résultant d’une traduction incorrecte du contenu ou de son utilisation par les clients.

La version anglaise de cet article est la suivante: 2605597
Symptômes
Lorsqu'une application utilise le Microsoft.NET Framework 3.5 ou le fournisseur de données Microsoft.NET Framework 4 pour Microsoft SQL Server (SQLClient) pour se connecter à une base de données en miroir, vous pouvez recevoir le message d'erreur suivant :
Délai d'attente a expiré. Le délai d'attente écoulée avant l'achèvement de l'opération ou le serveur ne répond pas.
à System.Data.SqlClient.SqlInternalConnection.OnError (SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
à System.Data.SqlClient.TdsParserStateObject.ReadSniError (TdsParserStateObject stateObj, UInt32 erreur)
à System.Data.SqlClient.TdsParserStateObject.ReadSni (asyncResult de DbAsyncResult, TdsParserStateObject stateObj)
à System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket()
à System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake (Boolean crypter, Boolean trustServerCert, Boolean & marsCapable)
à System.Data.SqlClient.TdsParser.Connect (Infos serveur du Infos serveur du, SqlInternalConnectionTds, connHandler, ignoreSniOpenTimeout de type Boolean, Int64, timerExpire, Boolean crypter, Boolean trustServerCert, Boolean integratedSecurity)
à System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin (Infos serveur de des infos serveur du, chaîne newPassword, Boolean ignoreSniOpenTimeout, TimeoutTimer du délai d'attente, SqlConnection owningObject)
à System.Data.SqlClient.SqlInternalConnectionTds.LoginWithFailover (Boolean useFailoverHost, Infos serveur du primaryServerInfo, failoverHost de chaîne, chaîne newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, délai d'attente de TimeoutTimer)
Remarque Si la propriété ConnectionTimeout est définie à la valeur par défaut de 15 secondes, vous pouvez recevoir le message d'erreur une fois que la connexion est ouverte pour les 1,2 secondes.
Cause
Ce problème se produit en raison d'une erreur dans l'algorithme de tentative de connexion pour les bases de données en miroir.

Lorsque l'algorithme de relance est utilisé, le fournisseur de données attend que le premier appel de lecture (SniReadSync) à la fin. L'appel est envoyé à l'ordinateur principal exécutant SQL Server, et le temps d'attente est calculé en multipliant la valeur du délai d'attente de connexion à 0,08. Toutefois, le fournisseur de données définit incorrectement une connexion à un état vouée à l'échec si une réponse est lente, et si le premier appel de SniReadSync n'est pas terminé avant l'expiration du délai d'attente.

Remarque La réponse lente peut dans ce cas être déclenchée par le serveur ou à la latence du réseau.
Résolution
Ce problème est résolu dans le.NET Framework 4.5.2. Outre le point 4.5.2 du.NET Framework, il existe correctifs disponibles pour d'autres versions du.NET Framework comme indiqué dans la section suivante.

Informations sur le correctif

Un correctif pris en charge est disponible auprès de Microsoft. Toutefois, ce correctif vise à corriger uniquement le problème décrit dans cet article. Appliquez ce correctif uniquement aux systèmes qui rencontrent le problème décrit dans cet article. Ce correctif va peut-être subir des tests supplémentaires. Par conséquent, si vous n'êtes pas sérieusement concerné par ce problème, nous vous recommandons d'attendre la prochaine mise à jour logicielle qui contiendra ce correctif.

Si le correctif est disponible pour le téléchargement, il existe une section « Téléchargement de correctif logiciel disponible » au début de cet article de la Base de connaissances. Si cette section n'apparaît pas, contactez le Service clientèle et Support de Microsoft pour obtenir le correctif.

Remarque Si des problèmes supplémentaires se produisent ou si des procédures de dépannage sont nécessaires, vous devrez peut-être formuler une demande de service distincte. Les coûts habituels du support technique s'appliqueront aux questions et problèmes qui ne relèvent pas de ce correctif logiciel. Pour une liste complète des numéros de téléphone service clientèle de Microsoft ou pour créer une demande de service distincte, visitez le site Web Microsoft suivant : Remarque Le formulaire « Téléchargement de correctif logiciel disponible » affiche les langues pour lesquelles le correctif est disponible. Si vous ne voyez pas votre langue, c'est parce qu'il n'y a pas de correctif disponible pour cette langue.

Conditions préalables

Il y a deux hotixes pour le même problème. Un correctif s'applique pour le.NET Framework 3.5.1 et un correctif s'applique à la.NET Framework 4.0. Pour appliquer le correctif pour le Microsoft.NET Framework 3.5.1, vous devez disposer du.NET Framework 3.5.1 installé sur un ordinateur qui exécute l'un des systèmes d'exploitation suivants :
  • Windows 7 Service Pack 1 (SP1)
  • Windows Server 2008 R2 Service Pack 1 (SP1)
Remarque La fonctionnalité de.NET Framework 3.5.1 contient le Microsoft.NET Framework 2.0 Service Pack 2 (SP2).

Nécessite un redémarrage

Vous n'êtes pas obligé de redémarrer l'ordinateur après avoir appliqué ce correctif.

Informations de remplacement du correctif

Ce correctif ne remplace pas un correctif précédemment publié.

Informations sur les fichiers

La version internationale de ce correctif possède les attributs de fichier (ou ultérieure) répertoriés dans le tableau suivant. Les dates et heures de ces fichiers sont répertoriées en temps universel coordonné (UTC). Lorsque vous affichez les informations de fichier, il est converti en heure locale. Pour trouver la différence entre l'UTC et l'heure locale, utilisez l'onglet fuseau horaire dans l'élément de Date et heure dans le panneau de configuration.

Fichier d'informations pour le .net Framework 3.5.1

Pour toutes les versions prises en charge de type x 86 de Windows 7
Nom de fichierVersion de fichierTaille du fichierDateHeurePlateforme
System.Data.dll2.0.50727.56972,927,61630-Sep-201122:34x 86
Pour toutes les prises en charge les versions 64 bits de Windows 7 et de Windows Server 2008 R2
Nom de fichierVersion de fichierTaille du fichierDateHeurePlateforme
System.Data.dll2.0.50727.56973,095,55230-Sep-201122:28x64
Pour toutes les versions basés sur IA-64 prises en charge de Windows Server 2008 R2
Nom de fichierVersion de fichierTaille du fichierDateHeurePlateforme
System.Data.dll2.0.50727.56973,234,81630-Sep-201122:21IA-64

Fichier d'informations pour le .net Framework 4.0

Pour toutes les versions x86 de Windows 7 prises en charge
Nom de fichierVersion de fichierTaille du fichierDateHeurePlateforme
System.Data.dll4.0.30319.5453,027,72816-déc-201107:59x 86
Pour toutes les prises en charge les versions 64 bits de Windows 7 et de Windows Server 2008 R2
Nom de fichierVersion de fichierTaille du fichierDateHeurePlateforme
System.Data.dll4.0.30319.5453,174,16016-déc-201108:37x64
Pour toutes les versions basés sur IA-64 prises en charge de Windows Server 2008 R2
Nom de fichierVersion de fichierTaille du fichierDateHeurePlateforme
System.Data.dll4.0.30319.5453,366,16016-déc-201109:16IA-64
Remarque Ce problème est résolu dans le point 4.5.2 de Microsoft.NET Framework. Par conséquent, pour le fournisseur de données.NET Framework 4, mise à niveau du.NET Framework 4 le point 4.5.2 de.NET Framework est une autre résolution.
Contournement
Pour contourner ce problème, appliquez l'une des méthodes suivantes :
  • Définissez la chaîne de connexion du délai d'attente pour la valeur 150 qui définit un délai de 150 secondes. Lorsque vous effectuez cette opération, le fournisseur de données attend que 12 secondes pour terminer le premier appel de lecture. (Ce problème ne ne survient pas si l'appel est terminé dans les 12 secondes.)
  • Ajouter la Min Pool Size = 20 à la chaîne de connexion. Après avoir ajouté ce paramètre, le fournisseur de données conserve au moins 20 connexions dans le pool de connexion de données de l'application. Par conséquent, plus d'opportunités permettent de réutiliser une connexion existante au lieu d'ouvrir une nouvelle connexion. Et, lorsqu'une connexion existante est utilisée, vous ne recevez pas les messages d'erreur mentionnés dans la section « Symptômes ».

    Remarque La valeur par défaut de la Taille de Pool minimale est 0.
Plus d'informations
L'écran suivante capture affiche un capture du réseau entre le serveur d'applications et de SQL Server au moment où le problème s'est produit dans un scénario de test :



Dans cet exemple, nous pouvons voir que le serveur d'application ferme la connexion (paquet cadre 670 AF) environ une seconde dans la phase initiale de connexion (TDS:Prelogin). Lorsque le SQL Server répond à cinq secondes, cette réponse est trop tardive et client réinitialise la connexion. Comme expliqué dans la section « Cause », lorsque le délai de connexion est défini sur 15 secondes (la valeur par défaut), le délai d'expiration de connexion réel est calculé par l'algorithme de nouvelle tentative de connexion pour la mise en miroir est égal à 1,2 s (. 08 * 15).

L'exemple suivant est un Trace de l'enchère qui ont été capturées du test de serveur d'applications :

<prov.DbConnectionHelper.ConnectionString_Set|API> 1#, 'Data Source=MySQLServer;Failover Partner=MySQLServer2; Initial Catalog= TestMirror;Integrated Security=SSPI;Connection Timeout=15'enter_02 <SNIReadSync|API|SNI> 2#{SNI_Conn}, pConn: 007D9EA8{SNI_Conn*}, ppNewPacket: 0671E268{SNI_Packet**}, timeout: 1134enter_03 <Np::ReadSync|API|SNI> 3#, ppNewPacket: 0671E268{SNI_Packet**}, iTimeOut: 1134<SNI_Packet::SNIPacketAllocateEx2|API|SNI> pConn: 007D9EA8{SNI_Conn*}, IOType: 0, consumer: 0<SNI_Packet::SNIPacketNew|API|SNI> pConn: 007D9EA8{SNI_Conn*}, IOType: 0ObtainIDa 5# <SNI_Packet::SNI_Packet|ID|SNI> 0624EEF0{.}<SNI_Packet::SNI_Packet|SNI> 5#{SNI_Packet} created by 2#{SNI_Conn}<SNI_Packet::SNIPacketNew|RET|SNI> 0624EEF0{SNI_Packet*}<SNI_Packet::SNIPacketAllocateEx2|RET|SNI> 0624EEF0{SNI_Packet*}<Np::ReadSync|ERR|SNI> ProviderNum: 4{ProviderNum}, SNIError: 11{SNIError}, NativeError: 258{WINERR}<Np::ReadSync|RET|SNI> 258{WINERR}leave_03<SNIReadSync|RET|SNI> 258{WINERR}, Packet: 00000000leave_02<sc.SqlError.SqlError|ERR> infoNumber=-2, errorState=0, errorClass=11, errorMessage='Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.', procedure='', lineNumber=0<sc.SqlInternalConnectionTds.BreakConnection|RES|CPOOL> 4#, Breaking connection.<prov.DbConnectionInternal.|RES|INFO|CPOOL> 4#, Dooming<sc.SqlInternalConnectionTds.LoginFailure|RES|CPOOL> 4# DoomThisConnection|RES|INFO|CPOOL> 4#, Dooming<sc.SqlInternalConnectionTds.LoginFailure|RES|CPOOL> 4#
De même, lorsque vous examinez le tampon en anneau connectivité pour les temporisations de connexion sur le SQL Server, vous remarquez que le processus de connexion a expiré dans une courte période de millisecondes.

Pour obtenir la sortie de la mémoire tampon ring à partir de Management Studio, exécutez la requête suivante :

SELECT CAST(record AS XML) FROM sys.dm_os_ring_buffers WHERE ring_buffer_type = 'RING_BUFFER_CONNECTIVITY'

Références
Pour plus d'informations sur la propriété SqlConnection.ConnectionTimeout , reportez-vous au site Web MSDN suivant :Pour plus d'informations sur l'algorithme de nouvelle tentative de connexion pour les connexions TCP/IP, reportez-vous au site Web MSDN suivant :Pour plus d'informations sur l'espace de noms System.Data.SqlClient , visitez le site Web MSDN suivant :Pour plus d'informations sur la mise en miroir de base de données, reportez-vous au site Web MSDN suivant :

La mise en miroir ; SQL Server;. Fournisseur SqlClient du NET


Statut
Microsoft a confirmé l'existence de ce problème dans les produits Microsoft répertoriés dans la section « S'applique à ».

Propriétés

ID d'article : 2605597 - Dernière mise à jour : 11/14/2015 03:52:00 - Révision : 4.0

Microsoft .NET Framework 3.5 Service Pack 1, Microsoft .NET Framework 4.0, Microsoft SQL Server 2008 Developer, Microsoft SQL Server 2008 Enterprise, Microsoft SQL Server 2008 Enterprise Evaluation, Microsoft SQL Server 2008 R2 Developer, Microsoft SQL Server 2008 R2 Enterprise, Microsoft SQL Server 2008 R2 Standard, Microsoft SQL Server 2005 Developer Edition, Microsoft SQL Server 2005 Enterprise Edition, Microsoft SQL Server 2005 Standard Edition

  • kbqfe kbfix kbexpertiseadvanced kbsurveynew kbmt KB2605597 KbMtfr
Commentaires