有很多帖子说SingleInstance
是一个糟糕的设计。但我认为这是我情况下的最佳选择
在我的服务中,我必须返回当前登录用户的列表(带有附加数据)。此列表对所有客户端都是相同的。我想每隔5秒从数据库中检索一次这个列表(例如),并在需要时将其副本返回给客户端
如果我使用PerCall
实例化模式,我将每次从数据库中检索此列表。该列表应包含约200-500条记录,但将来可能会增加到10000条。每条记录都很复杂,包含大约10个字段。
那么性能呢?使用“糟糕设计”并获取列表一次或使用“好方法”并在每次调用时从数据库获取列表是否更好?
答案 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"];
}
现在,您可以拥有所有访问同一个缓存的实例。