繁体   English   中英

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

[英]Is it bad practice to use static fields to cache large objects in ASP.NET?

最近,我已经阅读了很多有关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;
    }
}

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

  1. 我想缓存从存储中检索昂贵的大型数据集
  2. 数据将被缓存数小时或数天,而陈旧性则不必担心。
  3. 数据经常使用,但通常针对特定请求进行唯一过滤或转换。
  4. 数据量在主机服务器的内存容量之内。

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

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

无论如何,有时使用静态变量来缓存某些内容是适当的。 但是,一般而言,您应该初始化静态变量,并且在整个过程中都不要更改它们。 一旦您开始玩东西,就会开始感到痛苦。

这是一个旧线程,但是有一个简单的解决方案来解决两个线程在遇到一些未填充的数据高速缓存时执行相同工作的问题。

public static class Repository<T>
{
    private static readonly object LockSemaphore = new object();
    private static T _dataYouWantCached;

    public static void ReadData()
    {
        if (_dataYouWantCached != null)
        {
            return _dataYouWantCached;
        }

        lock (LockSemaphore)
        {
            //This second check will prevent the "next" thread from requerying the same data that
            //the first thread populated.
            if (_dataYouWantCached != null)
                return _dataYouWantCached;

            _dataYouWantCached = SomeStaticDataAccess.LoadData();

            return _dataYouWantCached;
        }   
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM