2009-09-16 5 views
1

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

+1

Les connexions sont-elles réellement fermées *? – mxmissile

+0

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

Répondre

2

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.

+0

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

+0

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

+0

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? –

Questions connexes