В настоящее время я создаю веб-службу 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 работает в многопоточном сценарии?
Если нет, есть ли поточно-ориентированная альтернатива?
Да, я мог бы просто заблокировать все методы доступа к базе данных в моем веб-сервисе, но а) это некрасиво и б) если в этом нет необходимости, я бы предпочел, чтобы я не пришлось :)
Заранее спасибо!