1

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

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

4

1 回答 1

2

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

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

或者,您可以只利用缓存层来保存查询结果,而不是将其耦合到您的服务。

那么你的代码可能看起来像这样:

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"];

}

现在,您可以拥有任意数量的实例来访问同一个缓存。

于 2012-10-22T16:00:36.513 回答