我們目前有多個使用默認ServiceBehavior
的WCF服務。由於可擴展性問題,我們正在考慮應用ConcurrencyMode = ConcurrencyMode.Multiple
屬性來提高吞吐量。我們所有的服務電話是完全無狀態的,例如:ConcurrencyMode.Multiple in stateless WCF services
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
類(以及所有其他遵循相同模式的類)是否也需要鎖定?
我知道所有類應該是防彈的最大安全,但不幸的是時間限制不允許這...我們需要儘快獲得代碼。
感謝marc - 我們設法說服客戶,這會給每個人帶來更多問題,經過進一步的討論發現他們實際上並不需要立即返回所有數據,只是認爲它會「有用」而不考慮其影響。我們現在返回的數據的一小部分已經使性能問題無效。 – 2011-01-12 07:08:53