2009-08-11 4 views
1

J'ai un site Web asp.net et une base de données.Emplacement approprié pour la connexion db dans le service Web SOAP (.net)

Le site Web a un service Web pour stocker les commentaires de mon logiciel. Pour autant que je sache, IIS réutilisera l'objet créé pour les demandes séquentielles. Cela donne une raison pour se connecter à la base de données dans le constructeur du service Web, implémenter correctement la méthode Dispose() et utiliser la connexion pour servir chaque [WebMethod] Request(). L'édition actuelle suit ce modèle. Par contre, je crains que le délai entre les demandes séquentielles et le service Web soit plus long que le délai d'expiration de la connexion DB. Je vais donc avoir besoin d'attraper une exception et de recréer la connexion (non?)

L'approche alternative est de se connecter et de fermer dans chaque [WebMethod] Foo(). Mais j'ai peur que cela puisse nuire à la performance.

En résumé, dois-je me connecter à DB dans le constructeur et fermer la connexion au Dispose() ou connecter et fermer DB pour chaque requête?

+0

Non, l'objet de service Web ne sera pas réutilisé. Une nouvelle instance sera créée pour chaque requête. –

Répondre

5

Vous devez vous connecter pour chaque requête. L'instance de page n'est utilisée que pour une seule requête. Vous ne pouvez donc pas y stocker de connexion pour la réutiliser. Vous devriez le stocker ailleurs, et c'est tellement compliqué (avec la sécurité des threads et autres) que ça n'en vaut vraiment pas la peine. Lorsque vous fermez la connexion, la connexion à la base de données réelle est renvoyée au pool de connexions.

Le pool de connexions se charge de réinitialiser correctement la connexion lorsqu'il est réutilisé pour l'objet de connexion suivant que vous créez, de sorte que vous obteniez une connexion active et non perturbée par une utilisation antérieure. Le pool de connexion fonctionne correctement, et vous devriez l'utiliser au lieu d'essayer d'en créer un vous-même.

Vous n'avez rien à faire de spécial pour utiliser le regroupement de connexions, il est intégré au pilote de la base de données. Il suffit d'ouvrir et de fermer les objets de connexion comme d'habitude.

+0

Pour nous, les gens de Java, êtes-vous en train de dire que dans asp.net vous obtenez automatiquement la mise en commun des connexions ou y a-t-il un peu de config ou de codage spécifique à faire? La transaction de pool de threads est-elle détectée? Pourrait aider les futurs lecteurs si vous avez épelé cela dans la réponse. – djna

+0

Bon point. Je vais faire un peu d'édition ... :) – Guffa

+0

merci d'expliquer :-) – djna

0

Avez-vous des possibilités de mise en commun de connexions à votre disposition? Vos objets WS captureraient une connexion du pool et les retourneraient quand ils seraient terminés. La piscine traite des délais d'attente et d'ouverture et de fermeture réelles.

Ma commande d'approche serait:

1). Si vous avez une connectio, utilisez-la.

2). Sinon, restez simple, ouvrez et fermez à chaque demande. L'écriture d'un pool de connexions thread-safe n'est pas triviale.

3). Si les performances s'avèrent être un problème, recherchez si le surcoût de connexion à chaque fois est la cause. Si c'est le cas, trouvez un code implmentaiotn ou un code (dernier recours) pour vous mettre en commun.

1

ADO.NET 2.0 et suivantes Les connexions DB sont regroupées, de sorte que l'ouverture et la fermeture réelles des connexions sont gérées par le pool de connexions DB, vous pouvez les ouvrir et les fermer librement selon vos méthodes individuelles. . Vous pouvez également configurer les paramètres du pool.

Questions connexes