【问题标题】:Best way to cache stored procedure result in C#在 C# 中缓存存储过程结果的最佳方法
【发布时间】:2012-11-20 13:53:45
【问题描述】:

我在 ASP.NET/C#/SQL Server 2012 中运行一个需要缓存一些存储过程查询结果的网站。结果应该有一个绝对过期。有什么选择可以做到这一点?

最好设置 command.ExpirationDateTime = DateTime.Now.AddMinutes(10) 会很棒,但据我所知,这是不可能的。

编辑: 数据将从 API 返回,因此无法使用页面或用户控件进行缓存。

【问题讨论】:

    标签: c# sql-server caching stored-procedures


    【解决方案1】:

    查看企业库缓存应用程序块。这具有您正在寻找的确切功能

    The Caching Application Block

        cache.Add(listid.ToString(), list, CacheItemPriority.Normal, null, 
    new SlidingTime(TimeSpan.FromMinutes(60)));
    

    【讨论】:

    • 看起来缓存应用程序块已移至 .NET Framework 4.0:“缓存应用程序块功能内置于 .NET Framework 4.0;因此企业库缓存应用程序块将在 5.0 之后的版本中弃用。您应该考虑在未来的开发中使用 .NET 4.0 System.Runtime.Caching 类而不是缓存应用程序块。”。见msdn.microsoft.com/en-us/library/ff664753(v=pandp.50).aspx
    【解决方案2】:

    我不明白您对实际执行缓存的位置的限制,但我假设您可以访问HttpRuntime.Cache?如果是这种情况,我在一篇博文 (Caching Services - The Lazy Way) 中编写了一系列用于缓存服务响应的实用程序。

    这个实用程序的基础是你可以做的:

       string cacheKey = GenerateCacheKey(myParam); //most likely a derivative of myParam
    
       if (Cache.IsInCache<MyResultType>(cacheKey))
       {
          return Cache.GetFromCache<MyResultType>(cacheKey);
       }
    
       var result = GetMyRequestedResult(myParam);
       if (result != null) //or whatever makes sense
       {
          Cache.InsertIntoCacheAbsoluteExpiration(cacheKey, result, DateTime.Now.AddMinutes(0));
       }
    
       return result;
    

    如果您在两者之间有任何服务,该帖子会显示一个用于与这些服务交互/缓存的可爱类。

    【讨论】:

    • 我认为这里有趣的部分是 GenerateCacheKey(),但它可能应该在命令上而不是在参数上。我猜你可以通过校验命令文本和参数名称、类型和值来创建一些东西。
    • 这完全取决于你......在我的大多数用例中,我不会缓存微调查询(给我所有姓氏与 Jake 押韵的员工,出生于 11 月,收入为 50,000 美元至 50,500 美元,并且已婚);不仅因为在合理的窗口中重新访问该数据的机会很小,而且缓存键会令人发指。我通常会缓存门控查询,就像博客中显示的那样。甚至可以达到cacheKey = string.Format("{0}_{1}_{2}_{3}", new object[] {param1, param2, param3, param4}),但不会更远。
    【解决方案3】:

    我最终通过将命令文本与参数名称和值合并,从 SqlCommand 创建了一个散列。在将内容放入/从 HttpContext.Current.Cache 对象中/从中获取内容时,我用作缓存键的那个哈希值。工作正常。可能不是超级快,但由于某些查询速度要慢得多,所以没关系。

    【讨论】:

      【解决方案4】:

      您还可以从 .Net Framework 4 开始使用 System.Runtime.Caching.ObjectCache,而不仅仅是在 Web 应用程序中。这是一个例子:

      List<EmailData> result = null;
      
      ObjectCache cache = MemoryCache.Default;
      var key = string.Concat(title, ":", language);
      var item = cache.GetCacheItem(key);
      
      if (item != null)
        return item.Value as List<EmailData>;
      
      using (var connection = _connectionFactory.OpenConnection())
      {
        result = connection.Query<EmailData>(sql, new { title, language }).ToList();
      }
      
      var cachingPolicy = new CacheItemPolicy
      {
        AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(_cacheExpirationIntervalInMinutes)
      };
      
      cache.Set(new CacheItem(key, result), cachingPolicy);
      
      return result;
      

      您可以阅读更多:https://msdn.microsoft.com/en-us/library/system.runtime.caching.objectcache(v=vs.110).aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-20
        • 2013-08-17
        • 1970-01-01
        • 1970-01-01
        • 2018-05-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多