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!

Si vous ne partagez pas la même instance sur les threads et les éléments statiques de la classe sont thread-safe, alors vous n'avez pas de problème
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