2010-08-13 16 views
0

Dans un service Web pré-WCF .NET (C#), j'ai une ressource IDisposable cher que je représente une référence statique (en fait ThreadStatic) à. (En interne, il contient une SqlConnection.) Comment puis-je m'assurer qu'il est éliminé lorsque le pool d'applications est actualisé, devrais-je simplement supprimer l'avertissement FxCop et ne pas m'inquiéter à ce sujet, ou existe-t-il une troisième option?Mise au rebut des ressources statiques dans le service Web

A l'origine le service a ouvert la connexion sur chaque demande avec un bloc à l'aide, mais que la conception a été rejetée en raison d'un « problème de ressources de connexion. »

Répondre

1

Cette conception sera rejetée en raison d'un problème de ressources de connexion. Si vous avez eu des problèmes auparavant, vous les aurez à nouveau, puisque vous utiliserez maintenant plus de connexions SqlServer (si c'est thread statique, chaque thread aura un SqlServer et - plus important encore - une connexion réelle sous-jacente, même si elle n'utilise pas la connexion et aurait renvoyé la connexion sous-jacente à la piscine).

+0

Très bon point. Je n'ai pas choisi le nouveau design. Que suggérerais-tu? – TrueWill

+1

Vous devez réexaminer votre problème de ressource de connexion et voir quel était le problème réel. En règle générale, le meilleur modèle est d'ouvrir une connexion, d'effectuer l'opération, puis de la fermer, soit par un bloc utilisant la connexion, soit - si vous renvoyez un lecteur de données afin qu'il puisse être itéré de manière efficace, block créé avec l'option CloseConnection afin que le trigger soit la disposition de la connexion. De cette façon, la connexion "réelle" est renvoyée au pool dès que possible. Votre changement ici aggrave les choses en ne le retournant jamais. Où est-ce que le modèle habituel s'est mal passé? ... –

+0

... est-ce que des erreurs se sont produites entre créer une connexion pour un lecteur de données (et donc pas utiliser) et mettre le lecteur de données dans l'utilisation? Une telle situation peut provoquer des fuites (j'utilise pour cela une classe wrapper qui disposera de la connexion à sa disposition, mais quand elle créera avec succès un lecteur de données avec l'option de fermeture, elle cessera de posséder la connexion, car c'est maintenant le lecteur qui Une autre source d'erreurs est si vous faites le 'using 'sur le lecteur de données dans un bloc d'interactivité et, que ce soit comme une erreur ou délibérément, n'entrez jamais le bloc using car le premier ... –