gpt4 book ai didi

.net - SQL 缓存和 Entity Framework

转载 作者:行者123 更新时间:2023-12-04 07:29:23 26 4
gpt4 key购买 nike

我已经建立了一个小型 ASP.NET MVC 2 站点,该站点进行了一些非常广泛的日期挖掘/表连接/等。

使用 MVC,我有一个 Controller ,它以多种不同的形式(表格、图像等)返回数据。为了避免频繁访问数据库,我有一个双缓存机制:

  • 对于相同操作的相同参数,我使用 OutputCacheAttributeVaryByParam = "*" .
  • 假设 Action 的某些参数已更改(或调用另一个 Action ),仍有可能我的“数据”先前已被请求,因此我在第一次命中数据库后将数据存储在 View 模型中,我实现了这一点使用 .NET 4.0 System.Runtime.Caching.ObjectCache .
  • ObjectCache 的示例 Controller 内部:
    private static readonly ObjectCache cache = 
    new MemoryCache("CompareControllerCache");
    private static void CacheObject(ViewModel obj,
    string param1,
    int someOtherParam )
    {
    string key = string.Format("{0}-{1}", param1, someOtherParam);
    Trace.WriteLine(string.Format("Adding {0} to the cache", key));
    cache.Add(key, obj, new CacheItemPolicy
    {
    SlidingExpiration = TimeSpan.FromMinutes(1)
    });
    }

    // Corresponding GetCachedObject with similar key defining logic.

    这给了我很好的性能提升,但它失败的地方是 CacheItemPolicy非常简单。理想情况下,我希望缓存窗口更大,但如果数据库更改,则缓存项会过期。
    CacheItemPolicy似乎通过 ChangeMonitors 支持这一点集合,我可以添加一个 SqlChangeMonitor ,但是在尝试构建时,我停下来了。

    我正在使用 Entity Framework 4 访问 SQL 数据库,如何 我如何构建 SqlChangeMonitor监视可能触发缓存过期的几个数据库表?
    SqlChangeMonitorSqlDependency 构成这需要一个 SqlCommand - 如何锁定 Entity Framework 对我的数据库的封装?

    最佳答案

    可以将任意 LINQ 查询包装在 SqlDependency 中,包括 EF Linq 查询,请参阅 LinqToCache .但不幸的是,EF 选择为查询制定 SQL 的方式,即使是最简单的 from t in context.table select t , 与 Query Notificaiton 限制不兼容,并且 SqlDependency 作为无效语句立即失效。我已经在SqlDependency based caching of LINQ Queries中讨论过这个问题.

    你可以做的是使用 SqlChangeMonitor用直截了当的SqlCommand构造为简单的对象 SELECT ... FROM Table在你可能会改变的 table 上。您需要了解设置通知的成本和轮询的成本之间存在平衡,如果您的表频繁更改,那么监控更改可能会比轮询更昂贵。看这篇文章 The Mysterious Notification了解 QN 的工作原理以及监控成本是多少。

    关于.net - SQL 缓存和 Entity Framework ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3568178/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com