在ASP.NET中使用静态字段缓存大对象是不好的做法吗?

wwa*_*rby 8 .net c# asp.net caching static-members

我最近一直在阅读有关ASP.NET的缓存策略的内容,而且我从未提及使用静态字段作为缓存存储的首选方法.这是一种不好的做法,如果是这样,为什么?以下是我通常如何使用它的示例:

public static Class Repository {
    private static object _lockObject = new object();
    private static List<Products> _products = null;
    public static void GetProducts() {
        if (_products != null) { return _products; }
        lock(_lockObject) {
            _products = DAL.LoadProducts()
        }
        return products;
    }
}
Run Code Online (Sandbox Code Playgroud)

我更喜欢这种模式的原因是,System.Runtime.Caching.MemoryCache是​​因为它不使用序列化,因此可以扩展到大对象; 我已经成功地使用它来从整个数据库表中缓存非常大的对象集合,然后我使用LINQ查询而不是使用SQL查询数据库,从而大大提高了性能.这种模式在以下场景中的许多项目中都很有用:

  1. 我想缓存从存储中检索昂贵的大型数据集
  2. 数据将缓存数小时或数天,并且不会影响陈旧性.
  3. 数据经常使用,但通常根据特定请求进行唯一过滤或转换.
  4. 数据量轻松地在主机服务器的内存容量内.

由于我发现这种模式非常有用,我很好奇为什么关于这个主题的各种书籍和教程甚至都没有真正讨论它作为一种选择.

Eri*_*sch -1

鉴于您对 MemoryCache 的理解是错误的,并且与静态存储相比,在 MemoryCache 中可靠地存储某些内容所需的代码更少,我不明白为什么您会坚持使用容易出错、泄漏且更困难的模式使用...

无论如何,有时使用静态来缓存某些内容是合适的。但是,一般来说,您应该初始化静态变量,并且在进程的生命周期中永远不要更改它们。一旦你开始玩东西,你就会开始感到疼痛。

  • 没有必要做出那种嘲讽的回答。我花时间来到这里询问我的模式是否困难。显然,我确实对 MemoryCache 的工作原理有误解,因此它可能是更好的解决方案,但我的代码在该术语的正常意义上并不存在泄漏 - 它在进程的生命周期内将数据保存在内存中,这正是我的意图,如果该模式容易出错,它还没有给我带来任何此类问题。 (11认同)