我有一个WCF服务,用于从我的数据库中获取一些数据。数据库的大小非常大,约为2 GB。所以我缓存这些数据。我希望当服务主机应该缓存这些数据时,我首先使用
InstanceContextMode = InstanceContextMode.Single
这个Service Behviors允许我在服务构造函数中简单地编写缓存代码,因为只有在servicehost.open()时才会调用构造函数。方法调用。每当客户端通过代理构造函数调用此服务时,将不会调用。这非常好。后来我意识到当1000个用户一次调用此服务时,此InstanceContextMode会出现性能问题,因为此服务的单个实例仅为所有请求提供服务。为了获得最佳性能,我将设置更改为
InstanceContextMode = InstanceContextMode.PerCall 同 ConcurrencyMode = ConcurrencyMode.Multiple
现在我希望获得与缓存服务主机数据时相同的缓存功能。请帮我解决这个问题。
请通过CustomBehaviors让我知道我可以实现这个目标吗?
此致 RIZWAN
答案 0 :(得分:0)
InstanceContextMode.PerCall
与ConcurrencyMode.Multiple
的组合没有意义。 PerCall实例化为每个请求创建新的服务实例。多并发模式允许服务实例处理多个并行请求。如何使用仅为处理单个请求而创建的服务实例(PerCall)来处理并行请求(多个)?
我认为通过调用您的单例服务(我相信您也使用ConcurrencyMode.Multiple
)与1000个并发用户发生的问题仅仅是基于服务器没有性能来处理如此多的并发用户或服务代码/缓存未优化。使用PerCall实例化无法解决这个问题。
无论如何,如果你想在服务的多个PerCall实例之间共享一些缓存,你必须创建一个代表你的缓存的众所周知的对象 - 使用单例模式或服务定位器。该对象将处理来自服务实例的缓存和并发访问。