Une application asp.net sur laquelle je travaille peut avoir quelques centaines d'utilisateurs essayant de se connecter. Nous obtenons une erreur que le nombre maximal de connexions dans le pool a été atteint. Je comprends le concept des pools de connexion dans ADO.NET bien que dans les tests, j'ai trouvé qu'une connexion est restée "dormante" sur le serveur ms sql 2005 quelques jours après la connexion et le navigateur a été fermé. J'ai essayé de limiter la durée de vie de la connexion dans la chaîne de connexion, mais cela n'a aucun effet. Dois-je pousser le nombre maximum de connexions? Ai-je complètement mal diagnostiqué le vrai problème?Les connexions ADO.NET SqlData Client ne disparaissent jamais
Répondre
Toutes vos connexions de base de données doit être soit enveloppé dans un essai ... enfin:
SqlConnection myConnection = new SqlConnection(connString);
myConnection.Open();
try
{
}
finally
{
myConnection.Close();
}
Ou bien ... mieux encore, créer une DAL (couche d'accès aux données) qui a le Close() appel à la méthode Dispose et envelopper tout votre DB appelle avec un en utilisant:
using (MyQueryClass myQueryClass = new MyQueryClass())
{
// DB Stuff here...
}
quelques notes: ASP.NET ne compte sur vous pour libérer vos connexions. Il les libèrera par GC après qu'ils soient sortis de la portée, mais vous pouvez compter sur ce comportement car cela peut prendre beaucoup de temps - beaucoup plus longtemps que vous ne pouvez vous en permettre auparavant votre pool de connexions est épuisé. En parlant de cela, ASP.NET regroupe vos connexions à la base de données lorsque vous les demandez (en recyclant les anciennes connexions plutôt qu'en les relâchant complètement et en les demandant à nouveau à la base de données). Cela n'a pas vraiment d'importance en ce qui vous concerne: vous devez toujours appeler Close()!
De même, vous pouvez contrôler le regroupement en utilisant votre chaîne de connexion (par exemple, la taille du pool Min/Max, etc.). Voir this article sur MSDN pour plus d'informations.
J'ai hérité du code actuel et nous passons à un orm bientôt donc j'espère que cela peut résoudre le problème. Je vais jeter un oeil à la fermeture de la connexion dans un bloc final – CountCet
J'ai vérifié le code à nouveau et nous fermons la connexion correctement comme vous l'avez mentionné. J'ai isolé le code dans un test unitaire mais la connexion sur le serveur SQL reste bloquée pendant plus de 24 heures. – CountCet
CountCet: Je ne suis pas surpris que SQL Server montre encore la connexion comme ouverte depuis le pool le maintient ouvert. Le problème est pourquoi votre pool se remplit - pourquoi les connexions du pool à votre application ne sont pas publiées. Si la méthode "Close()" est appelée et que vous allez vérifier la base de données, vous ne verrez pas la connexion disparaître (c'est-à-dire que l'exécution de sp_who db n'est pas le diagnostic approprié). Maintenant, dans mon code, il y a des dizaines et des dizaines de points auxquels la base de données entre en jeu. Vous dites que vous avez "isolé le code" - avez-vous seulement un point par lequel vous vous connectez à la base de données? –
- 1. Connexions LINQ et services de données ADO.NET
- 2. IE6 - Les éléments ne disparaissent pas
- 3. Les liens hypertexte disparaissent
- 4. La fonction de sommeil de PHP et les connexions client
- 5. Service WCF unique pour plusieurs connexions client
- 6. ADO.NET Data Services cache client .NET
- 7. Pourquoi les images disparaissent-elles?
- 8. Services Web, pool de connexions ADO.NET, erreur de délai d'attente
- 9. Les données de session InProc disparaissent
- 10. Comment puis-je profiler le pool de connexions ADO.NET?
- 11. Les éléments StaticText disparaissent dans wx.StaticBox
- 12. La requête vers le serveur lié ne s'arrête jamais
- 13. WPF - window.show() ne libère jamais sa mémoire?
- 14. SubmitCompleteHandler GWT FormPanel ne se déclenche jamais
- 15. appel à une méthode ne retourne jamais
- 16. stress client: Limiter le nombre de connexions simultanées sous XP
- 17. <asp: les boîtes de TemplateField disparaissent
- 18. opération de service ADO.Net services avec des paramètres appelés bibliothèque client ne
- 19. Vider les pools de connexions JDBC
- 20. Puis-je utiliser des connexions cryptées avec Oracle Instant Client et ODP.NET?
- 21. PHP File Upload ... fichiers disparaissent dans le grand vide ... où personne ne peut les entendre crier
- 22. Quel est le meilleur algorithme/technique pour contrôler les connexions client au serveur?
- 23. ADO.NET Entity Framework SaveChanges() ne fonctionne pas
- 24. éléments TreeView disparaissent
- 25. Comment faire pour que les messages d'avertissement Eclipse ne disparaissent pas instantanément?
- 26. Le pool de connexion Hibernate c3p0 ne temporise pas les connexions inactives
- 27. IMAGE_CAPTURE L'intention ne retourne jamais à onActivityResult (int, int, Intent);
- 28. isValid() call ne retourne jamais sur MySQL JDBC Connection
- 29. Pourrais-je jamais revenir à ne pas utiliser ReSharper?
- 30. La session ne devrait jamais expirer par elle-même
Les connexions sont-elles réellement fermées *? – mxmissile
J'ai vérifié le code à nouveau et nous fermons la connexion dans le code mais sur le serveur SQL (en cours d'exécution sp_who2) je peux voir la connexion reste. Après avoir enquêté plus loin, j'ai trouvé un blog msdn qui confirme qu'il y a un bug lors de l'utilisation de "Connection Lifetime = (secondes)". Cette valeur n'a aucun effet. http://blogs.msdn.com/selvar/archive/2008/05/01/connectionlifetime-attribute-in-the-sqlconnection-connection-string-is-not-honored.aspx – CountCet