Является ли SqlConnection / SqlCommand потокобезопасным?

В настоящее время я создаю веб-службу WCF.

В рамках своей работы ему, к сожалению, потребуется выполнить некоторые довольно интенсивные вычисления, однако, к счастью, эти вычисления могут быть разделены между вызовами веб-службы. Фактически - нам нужно выполнить вычисления только один раз, и все последующие вызовы могут получить преимущество.

Однако, поскольку WCF не имеет общего состояния приложения, кажется логичным установить WCF в режиме единственного экземпляра.(Каждый клиент, по всей вероятности, потребует некоторых вычислений, что вынудит нас пересчитать их для каждого сеанса, который может быть нормальным, или для каждого вызова, что неприемлемо)

Однако я не очень хорошо знаком с защитным кодом для нескольких потоков. Я кое-что читал об этом, и, поскольку ни один из наших кодов WCF не записывает в общее состояние (кроме вычислительного бита, который легко защитить), я почти убежден, что мне не нужно изменить что-нибудь.

Однако есть одна загвоздка - мы используем SqlConnection и SqlCommand для связи с нашим сервером, и я не уверен, что я могу рассчитывать на их поточно-ориентированную безопасность?

РЕДАКТИРОВАТЬ: Возможно, мне следует пояснить, что Commands / Соединения всегда локальны для метода. Мы говорим о шаблоне в духе:

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
}

КОНЕЦ РЕДАКТИРОВАНИЯ

Я нашел класс SqlCommand в MSDN: http://msdn.microsoft.com/en-us/ library / system.data.sqlclient.sqlcommand.aspx , в котором говорится: «Любые общедоступные статические (общие в Visual Basic) члены этого типа являются потокобезопасными. Любые члены экземпляра не гарантируют потокобезопасность . "

Правильно ли я интерпретирую это, полагая, что это означает, что MS не гарантирует, что SqlCommand работает в многопоточном сценарии?

Если нет, есть ли поточно-ориентированная альтернатива?

Да, я мог бы просто заблокировать все методы доступа к базе данных в моем веб-сервисе, но а) это некрасиво и б) если в этом нет необходимости, я бы предпочел, чтобы я не пришлось :)

Заранее спасибо!

5
задан Fafnr 6 September 2011 в 07:39
поделиться