В настоящее время у нас есть несколько служб WCF, которые используют значение по умолчанию ServiceBehavior
.Из-за проблем с масштабируемостью мы рассматриваем применение атрибута ConcurrencyMode = ConcurrencyMode.Multiple
для повышения пропускной способности.Все наши сервисные вызовы не имеют состояния, например:
PersonService.cs:
public class PersonService : IPersonService
{
public GetPersonResponse GetPerson(GetPersonRequest request)
{
GetPersonResponse response = new GetPersonResponse();
try
{
response.Person = Person.GetPerson(request.PersonID);
return response;
}
catch (Exception ex)
{
return (GetPersonResponse) response.SetException(ex);
}
}
}
Person.cs:
public static class Person
{
public static PersonDataContract GetPerson(int personID)
{
PersonDataContract pdc = null;
// load contract from db...
pdc = Database.Load<PersonDataContract>(personID);
// Address is another static class in the same pattern as Person
pdc.Addresses = Address.GetAddressesForPerson(personID);
return pdc;
}
}
Все методы в Person
классы являются статическими для повышения производительности и не сохраняют состояния для безопасности потоков.Класс Database
также является статическим, но его методы ссылаются на статические переменные.
В этом контексте, что необходимо сделать поточно-ориентированным, чтобы ConcurrencyMode.Multiple
не вызывал проблем с многопоточностью?Я имею в виду только класс Database
, но нужно ли также блокировать класс Person
(и все другие классы, которые следуют той же схеме)?
Я знаю, что все классы должны быть пуленепробиваемыми для максимальной безопасности, но, к сожалению, временные ограничения не позволяют этого ... нам нужно получить код как можно скорее.