【问题标题】:Suggestion required to achieve caching functionality in WCF在 WCF 中实现缓存功能所需的建议
【发布时间】:2011-02-04 11:51:35
【问题描述】:

我有一个 WCF 服务,用于从我的数据库中获取一些数据。数据库的大小非常大,大约 2 GB。所以我缓存了这些数据。我想在服务主机时缓存这些数据,所以我首先使用了

InstanceContextMode = InstanceContextMode.Single

这个服务行为让我可以简单地在服务构造函数中编写缓存代码,因为构造函数只会在 servicehost.open(); 时被调用。方法调用。每当客户端将通过代理构造函数调用此服务时,都不会调用。这工作得很好。后来我意识到当 1000 个用户一次调用这个服务时,这个 InstanceContextMode 有性能问题,因为这个服务只有一个实例服务所有请求。为了获得最佳性能,我将设置更改为

InstanceContextMode = InstanceContextMode.PerCall 和 ConcurrencyMode = ConcurrencyMode.Multiple

现在我想获得与缓存服务主机数据时相同的缓存功能。请帮我解决这个问题。

请让我知道我可以通过 CustomBehaviors 实现这一点吗?

问候, 里兹万

【问题讨论】:

    标签: wcf


    【解决方案1】:

    InstanceContextMode.PerCallConcurrencyMode.Multiple 的组合没有意义。 PerCall 实例化为每个请求创建新的服务实例。多并发模式允许服务实例处理多个并行请求。只为处理单个请求(PerCall)而创建的服务实例如何用于处理并行请求(Multiple)?

    我认为通过调用您的单例服务(我相信您也使用ConcurrencyMode.Multiple)与 1000 个并发用户发生的问题仅仅是基于服务器没有性能来处理这么多并发用户或服务代码/缓存未优化。使用 PerCall 实例化无法解决此问题。

    无论如何,如果您想在服务的多个 PerCall 实例之间共享一些缓存,您必须创建一些众所周知的对象来表示您的缓存 - 使用单例模式或服务定位器。该对象将处理来自服务实例的缓存和并发访问。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      • 1970-01-01
      • 2012-01-29
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      • 2011-12-05
      相关资源
      最近更新 更多