清除SqlDataSource中的缓存

12

我需要手动清除启用了缓存的 SqlDataSource 的缓存。我已经尝试过将 EnableCaching 设为 false,并将 CacheDuration 设为 0(或者设为 1),但似乎都无法使已经缓存的内容过期,尽管它们似乎可以防止新的 SELECT 被缓存。

那么,如何手动使缓存失效呢?

谢谢。

4个回答

14

我今天刚开始研究这个问题,看到了这篇帖子,它似乎是最好的解决方案:

简单的方法以编程方式使SqlDataSource缓存失效

<asp:SqlDataSource ID="x" EnableCaching="True" CacheKeyDependency="MyCacheDependency"/>

protected void Page_Load(object sender, EventArgs e)
{ // Or somewhere else before the DataBind() takes place
  if (!IsPostBack)
  {
      //prime initial cache key value if never initialized
      if (Cache["MyCacheDependency"] == null)
      {
        Cache["MyCacheDependency"] = DateTime.Now;
      }
  }
}


// Evict cache items with an update in dependent cache:
Cache["MyCacheDependency"] = DateTime.Now;

FYI,这个解决方案是我用于我的项目中的,现在已经在生产环境中运行良好。 - Chris Marisic

0

禁用缓存(EnableCaching = false),然后强制进行新的选择(SqlDataSourceInstance.Select(new DataSourceSelectArguments()))再重新启用缓存可清除正在选择的特定CommandText和CommandParameters的组合,因此这是一个开始。

它仍保留着SqlDataSource执行的其他查询组合的缓存,因此这并不能解决所有问题。


0

请确保您的CacheExpirationPolicy是绝对的。使用非零的CacheDuration(0表示无限缓存持续时间)。


一旦我将它们设置为这种情况,并执行另一个Select(),它会清除我正在执行的查询的缓存,但保留所有其他CommandText、CommandParameters等的排列组合。那么我该如何清除它们呢? - azollman

0

我遇到了同样的问题,尽管设置 "EnableCaching=false"。
在高负载下,我看到一些缓存发生了。这个缓存导致我错过了很多数据。
我发现这可能与缓存有关。
因此,我在代码中使用了 Response.Cache.SetCacheability(HttpCacheability.NoCache);。它似乎起作用了,在12个小时后我没有少量丢失的数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接