De multiples SQL Simultanées des délais de Connexion En Multithread Service Windows
J'ai un multithread Service Windows j'ai développé avec VS 2010 (.NET 4.0) qui peut varier de quelques dizaines à quelques dizaines de fils, chaque récupération de données à partir d'un serveur lent sur Internet, puis à l'aide d'une base de données locale pour enregistrer ces données (ainsi, le processus de la direction d'Internet, pas de réseau local ou en CPU).
Avec une certaine régularité, je suis une inondation/rafale/rafale de l'erreur suivante à partir de plusieurs threads simultanément:
Système.Les données.SqlClient.SqlException (0x80131904): Délai d'attente expiré. Le délai écoulé avant la fin de l'opération ou le serveur ne répond pas.
La pile d'appel pour cette erreur est généralement:
au Système.Les données.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
au Système.Les données.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
au Système.Les données.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
au Système.Les données.SqlClient.SqlConnection.Open()
Je ne suis pas la spécification d'un Délai d'attente de Connexion dans la chaîne de connexion, et il y a d'autres applications et les processus de travail dans cette base de données. Quelqu'un a rencontré ce genre de comportement, et si oui quel a été fait pour l'empêcher?
Les plus communément appelée méthode dans ma couche d'accès aux données ressemble à ça, et tous mes autres DAL méthodes à suivre la même approche:
using (SqlConnection con = new SqlConnection(GetConnectionString()))
using (SqlCommand cmd = new SqlCommand("AddGdsMonitorLogEntry", con))
{
cmd.CommandType = CommandType.StoredProcedure;
/* setting cmd.Parameters [snipped] */
// We have been getting some timeouts writing to the log; wait a little longer than the default.
cmd.CommandTimeout *= 4;
con.Open();
cmd.ExecuteNonQuery();
}
Merci beaucoup!
MODIFIER
Des commentaires au sujet de ce produit dans le miroir environnements, je doit en effet mentionner que la base de données en question est en miroir. C'est marqué dans SSMS comme "Principal, Synchronisé", à la "Haute sécurité sans basculement automatique (synchrone)" mode.
MODIFIER 5/26/11
Je vois rien dans les journaux de SQL Server pour indiquer tous les problèmes. (Je n'ai pas accès à l'Observateur d'Événements de Windows sur le serveur, mais j'ai demandé à quelqu'un de regarder pour moi.)
- Je suis aussi de voir exactement le même problème, avec le même stacktrace. La base de données de la connexion est en miroir et la chaîne de connexion spécifie un partenaire de basculement. J'ai été incapable de reproduire le même problème sur mon bureau, l'ouverture d'un tas de connexions et de ne jamais fermer les résultats dans un autre message d'exception.
- Ces liens signaler un problème similaire, mais aucun n'offre une solution: 1 2 3 4 5
- Je pense que le problème n'est pas dans le cadre, du client ou de la base de données. Mais dans les requêtes exécutées. Vérifier, par exemple, de recueillir des statistiques ce qui SPs/requêtes soulève une exception le plus souvent
- Comme une mise à jour pour le problème que j'ai vu, l'ajout d'un Délai d'attente de Connexion=500; à la chaîne de connexion semble prévenir le problème. Ainsi, il semble comme il pourrait vraiment être un problème avec la base de données prend trop de temps à répondre, B=, mais je n'ai vraiment pas envie de quitter le délai d'expiration de haut.
- alors, quelle est votre résolution définitive de ce problème? Augmenter le délai d'attente (à quoi?) et d'augmenter le pool de connexion?
Vous devez vous connecter pour publier un commentaire.
Selon la MSDN post de Blog venez de créer aujourd'hui (vive Google!):
Le message en lui-même est intéressant de lire, de parler d'une connexion TCP/IP algorithme de relance. Et bravo à tous les gens qui ont dit "hé on dirait que c'est lié à la mise en miroir..."! Et de noter le commentaire à propos de cet être "en raison de la lenteur de la réponse à partir de SQL Server ou en raison de retards dans le réseau".
POUAH!!!
Merci à tous ceux qui ont posté. Maintenant, nous devons tous nous demander un patch pour le .NET Framework (ou certains autres ADO.NET correctifs mécanisme), de sorte que nous n'avons pas à attendre (et acheter) de Visual Studio 11...
Délai de connexion est une chose différente de commande timeout. Commande délai s'applique à la situation quand vous avez la connexion établie, mais en raison de certaines raisons internes serveur ne peut pas renvoyer des résultats dans les délais requis. La commande par défaut, le délai est de 30 secondes.
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.commandtimeout.aspx
Essayez de spécifier le délai d'attente de connexion dans la chaîne de connexion. La valeur par défaut est de 15 secondes, ce qui est peut-être la raison de la question que vous voyez.
Vous pouvez également spécifier le délai d'attente de connexion dans le code:
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectiontimeout.aspx
- Je obtenir ce à chaque fois dans un certain temps sur ce vieux serveur de base de données que nous avons (à venir sur 10 ans maintenant). Quand ça arrive mais c'est parce que quelque chose est martelant que chose avec des connexions/requêtes en permanence. Ma conjecture est que vous verrez que quand il arrive, le serveur de base de données est sous la charge (ou un nombre élevé de connexions ou quelque chose le long de ces lignes) de toute façon, dans mon expérience, si vous pouvez optimiser le code, optimiser la base de données, l'obtention d'un plus costaud serveur de base de données, etc. tous aide. Une autre chose que vous pouvez faire, qui Piotr suggère, est tout simplement le délai d'attente pour la connexion. J'aurais quand même aller à travers et optimiser des trucs bien (devrait aider dans le long terme).
J'ai pu un peu fiable reproduire ce problème. J'ai un service que lorsqu'un traitement est requis, il débute dans un nouveau domaine d'application /thread. Ce thread d'exécution de 10 à 16 requêtes de base de données simultanément. Quand je lance 30 de ces emplois, l'un après l'autre puis un hasard un ou deux des emplois de collision avec l'erreur de dépassement de délai.
J'ai changé la chaîne de connexion pour désactiver le Regroupement de Connexion avec mise en commun=false et puis l'erreur a changé à la suite. Cette lance 3 ou 4 fois à l'intérieur d'un agrégat d'exception, depuis les connexions se produisent à l'intérieur d'un Parallèle.Pour
Optimiser les requêtes que vous sont en cours d'exécution sur le serveur distant sera toujours aider. Le temps de chaque requête et de regarder pour de longues chers. Si vous êtes juste faire le lit puis utilisez le (NOLOCK) soupçon sur les instructions SELECT. C'était un épargnant de vie pour moi. Viens de lire sur elle pour s'assurer qu'il est approprié à votre application. Si vous avez accès à la base de données distante assurez-vous que le les index ne sont pas de la fragmentation des. Cela va entraîner un important ralentissement de l'exécution de la requête. Assurez-vous que les index sont reconstruits/réorganisé dans le cadre du plan de maintenance SQL. Ajouter de nouveaux indices, le cas échéant.
Prolonger le délai d'attente peut rendre les choses pire. Si vous laissez les requêtes s'exécutent plus de temps, puis, éventuellement, en plus des requêtes temps. Le délai d'attente est là pour protéger le serveur et d'autres clients qui y accèdent. Cogner un peu ce n'est pas une affaire énorme, mais que vous ne voulez pas les requêtes en cours d'exécution pour un long temps de tuer le serveur.