В настоящее время я создаю веб-службу WCF.
В качестве части ее работы, к сожалению, потребуется выполнить довольно интенсивные вычисления, однако эти вычисления, к счастью, могут быть разделены между вызовами веб-службы.По сути - нам нужно только выполнить вычисления один раз, и все последующие вызовы могут получить преимущество.
Однако, поскольку WCF не имеет общего состояния приложения, кажется логичным установить WCF в режиме одного экземпляра.(Каждому клиенту потребовались бы некоторые вычисления по всей вероятности, что вынуждает нас пересчитывать их для per-serssion, которые могли бы быть в порядке, или для per-call, которые несостоятельны)
Однако яне очень знаком с защитой кода для нескольких потоков.Я читал об этом кое-что, и поскольку ни один из нашего кода WCF не записывает в разделяемое состояние (кроме бита вычисления, который легко защитить), я почти уверен, что мне не нужно ничего менять.
Однако есть одна загвоздка - мы используем SqlConnection и SqlCommand для связи с нашим бэкэндом, и я не уверен, могу ли я рассчитывать на то, что они безопасны для потоков?
РЕДАКТИРОВАТЬ: Я долженвозможно, уточнить, что Команды / Соединения всегда локальны для метода.Мы говорим о паттерне в духе:
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
}
END EDIT
Я посмотрел класс SqlCommand в MSDN: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.aspx, который говорит: «Любая общедоступная статика(Совместно используемые в Visual Basic) члены этого типа являются поточно-ориентированными. Любые члены экземпляра не гарантируют поточно-ориентированные. "
Правильно ли я интерпретирую это, думая, что это означает, что MS не гарантировать, что SqlCommand работает в многопоточном сценарии?
Если это не так, есть ли потокобезопасная альтернатива?
Да, я мог бы просто заблокировать все методы доступа к базе данных в моем веб-сервисе, но а) это ужасно и б) если это не такЯ бы предпочел, чтобы мне не пришлось:)
Заранее спасибо!