27 votes

Comment traitez-vous au niveau du transport des erreurs dans SqlConnection?

Chaque maintenant et puis dans un volume élevé .NET application, vous pouvez voir cette exception lorsque vous essayez d'exécuter une requête:

Système.Les données.SqlClient.SqlException: Un niveau transport erreur s'est produite lors de l'envoi de la requête vers le serveur.

D'après mes recherches, c'est quelque chose que "ça arrive" et pas beaucoup peut être fait pour l'empêcher. Il ne se passe pas comme un résultat d'une mauvaise requête, et ne peuvent généralement pas être dupliqué. Il a juste les cultures en place, peut-être une fois tous les quelques jours dans un lieu occupé OLTP système lors de la connexion TCP à la base de données va mal pour une raison quelconque.

Je suis obligé de détecter cette erreur par l'analyse du message de l'exception, et puis de retenter l'ensemble de l'opération à partir de zéro, à inclure l'utilisation d'une nouvelle connexion. Rien de tout cela est joli.

Quelqu'un a des solutions de rechange?

7voto

Tim Farley Points 5809

J'ai posté une réponse à une autre question sur un autre sujet qui pourrait avoir une certaine utilité ici. Cette réponse impliqués connexions SMB, pas SQL. Cependant, il est identique en ce qu'il comportait un faible niveau d'erreur de transport.

Ce que nous avons trouvé était que, dans une situation de charge importante, il était relativement facile pour le serveur distant en temps de connexions au niveau de la couche TCP simplement parce que le serveur est occupé. Partie de la raison en était que les valeurs par défaut pour combien de temps TCP retransmet les données sur Windows ne sont pas adaptés à notre situation.

Regardez les paramètres de registre pour le paramétrage TCP/IP sur Windows. En particulier, vous voulez regarder TcpMaxDataRetransmissions et peut-être TcpMaxConnectRetransmissions. Valeur par défaut: 5 et 2 respectivement, essayez de monter un peu sur le système client et le double de la charge de la situation.

N'allez pas fou! TCP double le délai d'attente à chaque retransmission, de sorte que le délai de comportement pour de mauvaises connexions peuvent aller exponentielle sur vous si vous augmentez ces trop. Je me souviens de monter TcpMaxDataRetransmissions à 6 ou 7 résolu notre problème dans la grande majorité des cas.

3voto

Magnus Lindhe Points 2391

Ce post de blog par Michael Aspengren explique le message d'erreur "Une erreur de niveau transport s'est produite lors de l'envoi de la requête vers le serveur."

2voto

Daniel Fortunov Points 12044

Pour répondre à votre question initiale:

D'une façon plus élégante de détecter cette erreur particulière, sans analyse le message d'erreur, est d'inspecter l' Number de la propriété de l' SqlException.

(En fait, cela retourne le numéro d'erreur de la première SqlError dans la Errors de la collection, mais dans votre cas, l'erreur de transport doit être le seul de la collection).

1voto

Dale Wright Points 74

J'ai vu cela se produire dans mon propre environnement un certain nombre de fois. L'application cliente dans ce cas est installé sur de nombreuses machines. Certaines de ces machines se trouvent être les ordinateurs portables de gens ont été en laissant l'application, ouvrez le débrancher puis de le rebrancher et d'essayer de l'utiliser. Ce sera alors la cause de l'erreur que vous avez mentionnés.

Mon premier point serait de regarder le réseau et de s'assurer que les serveurs ne sont pas sur le DHCP et le renouvellement des Adresses IP à l'origine de ce message d'erreur. Si ce n'est pas le cas, alors vous devez commencer à trawlling à travers les journaux d'événements, à la recherche pour le réseau.

Malheureusement, il est comme indiqué ci-dessus, une erreur de réseau. La principale chose que vous pouvez faire est de surveiller les connexions à l'aide d'un outil comme netmon et travail en arrière à partir de là.

Bonne Chance.

1voto

f00 Points 9040

l'utilisation des Services de l'Entreprise avec les composants transactionnels

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X