ASP.NET使用SqlCommand设置缓存依赖项

时间:2009-09-29 15:36:33

标签: asp.net caching sqlcachedependency cache-dependency

这是一种根据查询设置缓存项的有效方法吗?

HttpRuntime.Cache.Insert(
                "ListLanguages",
                 list,
                 new SqlCacheDependency(command),
                 DateTime.UtcNow.AddMinutes(AppConfiguration.CacheExpiration.MinimumActivity),
                 Cache.NoSlidingExpiration);

命令是先前初始化为:

的SqlCommand
SqlCommand command = new SqlCommand("Listlanguages", connection);

其中“ListLanguages”是一个存储过程,只是一个选择。

我觉得这比聚合缓存依赖更简单,更容易防错(我的意思是故障证明,因为我不需要自己聚合表!)。

更有经验的程序员会怎么想?

1 个答案:

答案 0 :(得分:2)

我认为您不需要使用存储过程,该命令可以基于其中包含的select语句。

我个人避免使用SqlCacheDependency,我总是担心查询可能只是其中基于的代理系统没有处理的东西,我不能永远记住它们是什么。它看起来有点过于复杂,因此我担心它可能处于脆弱的一面。

修改

在用户更新其个人资料的特定情况下,我将使用更新个人资料的代码删除缓存副本。

在更一般的意义上,我会建立一个可接受的延迟来接收最新信息,并将绝对到期时间设置为。

如果是昂贵的SQL查询,我会考虑在其他表中暂存常用摘要,并让更新此数据的代码(如SP)调整或删除分阶段数据。

我并不是说我永远不会使用SqlCacheDepencency但是到目前为止我没有遇到过这样一个场景,尽管我确信它们存在但它是唯一明智的选择。我想这样的场景可能出现在你无法完全控制可能修改数据库的所有代码的地方。

什么是“最新”?

在Web应用程序中,用户可能看到的最新信息是最后一个响应中提供的信息。以下是一些需要考虑的事项。

  • 说他们已经取得了一些东西,然后被电话打断了5分钟。他们有多清醒,他们回来看的数据是5分钟,现在可能已经过时了?
  • 用户在提交数据之前几毫秒就会抓取一些内容,这会改变他们会看到的内容,这有多大问题?
  • 有人正在输入一些新数据,但尚未提交,是否可以说数据库中的当前数据本身已过时?

我要说的是,无论我们在系统中放置多少缓存聪明,都存在不可避免的延迟,我们接受这种延迟而不需要太多考虑。

考虑到这一点,在我们可能觉得有义务提供最新信息的许多情况下,这种义务并非真正有道理。一个很好的例子就是SO本身。我们在这里看到的许多查询结果实际上都是缓存的,并且可以看到与我们已经知道的更改不完全一致的数据。然而,其他人并没有意识到我们的变化,他们在我们制造它们的第二步中看到它们并不重要。