WCF中的单实例VS PerCall

时间:2012-10-22 15:47:10

标签: wcf performance concurrency instance

有很多帖子说SingleInstance是一个糟糕的设计。但我认为这是我情况下的最佳选择 在我的服务中,我必须返回当前登录用户的列表(带有附加数据)。此列表对所有客户端都是相同的。我想每隔5秒从数据库中检索一次这个列表(例如),并在需要时将其副本返回给客户端 如果我使用PerCall实例化模式,我将每次从数据库中检索此列表。该列表应包含约200-500条记录,但将来可能会增加到10000条。每条记录都很复杂,包含大约10个字段。

那么性能呢?使用“糟糕设计”并获取列表一次或使用“好方法”并在每次调用时从数据库获取列表是否更好?

1 个答案:

答案 0 :(得分:2)

  

那么性能呢?是否更好地使用"糟糕的设计"得到   列出一次或使用"好方法"从数据库中获取列表   每次通话?

性能和良好的设计不是互相排斥的。使用单个实例的问题是它一次只能处理一个请求。因此所有其他请求都在等待它完成它的事情。

或者您可以利用caching layer 来保存查询结果,而不是将其与您的服务相关联。

然后您的代码可能看起来像这样:

public IEnumerable<BigDataRecord> GetBigExpensiveQuery(){

   //Double checked locking pattern is necessary to prevent
   // filling the cache multiple times in a multi-threaded
   // environment
   if(Cache["BigQuery"] == null){
      lock(_bigQueryLock){
         if(Cache["BigQuery"] == null){
            var data = DoBigQuery();
            Cache.AddCacheItem(data, TimeSpan.FromSeconds(5));
         }
      }
   }

   return Cache["BigQuery"];

}

现在,您可以拥有所有访问同一个缓存的实例。