Est SqlConnection / SqlCommand thread-safe?
Je suis en train de créer un service web WCF.
Dans le cadre de son travail, il va malheureusement devoir faire de la assez intensif calculs, cependant, ces calculs peuvent heureusement être partagé entre les appels vers le webservice. En effet, nous avons seulement besoin de faire les calculs à la fois, et tous les appels suivants peuvent obtenir le bénéfice.
Cependant, depuis la WCF a pas partagé l'état de l'application, il semble logique d'ensemble de la WCF dans la seule instance de mode. (Chaque client aurait besoin d'un peu de calculs dans tous les probabilité, nous oblige à recalculer par-serssion qui pourrait être ok, ou par appel qui est intenable)
Cependant, je ne suis pas très familier avec la sécurisation de code pour plusieurs threads.
J'ai lu sur elle, et comme aucun de nos WCF code écrit à l'état partagé (autres que le calcul bits, ce qui est facile à protéger) je suis presque convaincu que je n'avez pas besoin de changer quoi que ce soit.
Il y a un seul hic, cependant, nous utilisons SqlConnection et SqlCommand pour communiquer avec notre backend, et je ne suis pas sûr si je peux compter sur ces être thread-safe?
EDIT: je devrais peut-être préciser que les Commandes et les Connexions sont toujours locales à une méthode. Nous parlons d'un motif dans la veine de:
using sqlConn = new SqlConnection(...) {
try {
sqlConn.Open()
} catch () {
throw new FaultException();
}
var cmd = new SqlCommand("Some SQL", sqlConn);
var reader = cmd.ExecuteReader();
//Read the stuff
reader.Close();
//Return something
}
FIN MODIFIER
J'ai regardé la classe SqlCommand sur MSDN:
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.aspx
qui dit: "Tout public static (Partagé en Visual Basic) les membres de ce type sont thread-safe. Tous les membres de l'instance ne sont pas garantis pour être thread-safe."
Suis-je interpréter cela correctement en pensant cela signifie que MS ne pas garantir que SqlCommand travaille dans un multi threaded scénario?
Si elle ne le fait pas, est-il un "thread-safe" alternative?
Oui, je pourrais juste verrouiller tous les accès à la base de méthodes dans mon webservice, mais une) c'est moche et b) s'il n'est pas nécessaire que je préfère, je n'ai pas de raison 🙂
Acclamations à l'avance!
Ne partagez pas ces instances dans les threads, les ouvrir, de les exécuter votre requête, et d'en disposer dès que possible. Le regroupement de connexion va gérer la connexion des optimisations.
OriginalL'auteur Fafnr | 2011-09-06
Vous devez vous connecter pour publier un commentaire.
Il fonctionne très bien dans un environnement multi-thread scénario aussi longtemps que vous l'utilisez correctement.
Si plusieurs threads tentent d'utiliser le MÊME SqlCommand, que pensez-vous qui va arriver? Comment pourrait-il travailler?
mais si différents threads à l'aide de différentes connexions question de différentes commandes de la même base de données, il n'y a pas de problème.
Les notes au sujet de la sécurité des threads sur MSDN sont vraiment cassé et mal rédigé, et doit être écrit par quelqu'un qui ne savait pas ce fil de sécurité est.
Ce qu'ils essaient de dire, avec ce message (qui est cloué sur 99,9% des classes et des fonctions documentées sur le site MSDN) est que "Toute méthode statique de ce type peut être appelé en toute sécurité simultanément par plusieurs threads. Tous les membres de l'instance sur la même instance n'est pas garanti d'être en sécurité en cas d'appel simultanément par plusieurs threads, mais l'accès de la même membre sur différents objets est parfaitement bien."
Comment sur les différents threads d'émission des commandes différentes, mais en utilisant un static singleton connexion? J'ai trouvé ce travail, mais le soupçonner qu'il pourrait briser dans certains cas.
OriginalL'auteur jalf
Je ne suis pas 100% sûr de ce que vous essayez de faire simultanément avec SqlCommand, mais quel que soit le filetage interne,-la sécurité, vous aurez sûrement des problèmes purement parce que l'utilisation de la SqlCommand l'oblige à maintenir un état, par exemple
Si vous essayez de partager la même commande de plusieurs threads, vous devez verrouiller quelque chose pendant que vous l'utilisiez.
Autant que SqlConnection va, il vous permettra seulement d'avoir une seule requête ouvrir à un moment, donc si vous êtes en utilisant DataReaders, vous auriez besoin de verrouiller quelque chose. L'utilisation de plusieurs connexions/commandes est essentiel si vous voulez exécuter plusieurs choses en même temps.
Je suis également pas sûr de ce que vous voulez dire quand vous dites WCF n'a pas partagé l'état de l'application - ce n'est pas forcément vrai, il dépendra de la façon dont vous êtes l'hébergement de votre application WCF. Si c'est un service WCF hébergé sous IIS avec
aspNetCompatibilityEnabled="true"
ensemble, vous avez toujours l'objet Application, vous obtenez un site web. Il y a d'autres options si vous ne l'utilisez pas aspNetCompatibility.OriginalL'auteur Richard
suffit d'utiliser la connexion et de commande de knly un thread et ne s'inquiètent pas de l'application au niveau thread problème sur ces. sql server est assez bon pour gérer la simultanéité pour vous n'avez pas besoin de verrouiller dans votre code. .Net pool de connexions est aussi là pour récupérer des liens valides rapide.
Je ne dis pas que l'ensemble de la WCF couche devrait se soucient pas de fils, mais ses DAL est de travailler en s'appuyant sur db verrouille pas .net serrures.
OriginalL'auteur Davide Piras