asp.net - 如何使带有 SqlDependency 的 OutputCache 依赖于每个请求的数据库中的一行?

标签 asp.net asp.net-mvc sql-server-2008 sql-server-2005 caching

我有个问题。找不到如何使 OutputCache SQLDependency 依赖于数据库表中的一行。
例如。
我有一个带有一个参数的 Controller 。

ActionResult Index(int? id)

对于具有相同 id 的每个请求,我需要检查数据库表 table1(id int, last_updated datetime)。如果 id = id 和 last_updated 的行没有改变。

我使用 sql server 2005 或更高版本。

我应该使用哪种策略?

我尝试使用:
[OutputCache(Duration = int.MaxValue, VaryByParam = "id", 
    SqlDependency = "DatabaseName:table1")]

但它适用于整个表格的变化。

最佳答案

为了避免为每个网页请求访问数据库(通常是一项昂贵的操作),可以使用对象缓存(在 .NET 4.0 中引入)。这将导致网页的快速服务,因为一切都将直接从内存中处理。仅当数据实际发生更改,或者由于资源限制或您的 CacheItemPolicy 设置而将缓存从内存中逐出时,才会发生数据库操作。

在这种情况下使用的实际策略如下。

第1步。在修改/添加/删除“id”行数据的模型方法中,完成该数据库操作,然后:

  • 如果您的对象已存在于缓存中,则将其驱逐;
  • Create a new cache entry为对象。

  • 第2步。尽可能从缓存中检索对象,仅在必要时从数据库刷新:
  • 从您的 Controller 操作方法中,调用返回由“id”参数标识的对象的模型方法;
  • 在您的 Model 方法中,检查此 ID 的缓存。如果它为空,则从您的数据库中检索数据并像往常一样构建对象,然后将完整的对象存储在缓存中;
  • 从 Model 方法中,将缓存的内容(即此 id 的特定对象)返回给调用 Controller 操作方法,然后让操作方法像往常一样填充和提供 View 。

  • (MemoryCache 类是 ObjectCache 类的具体实现)。

    使用这种方法,根本不需要使用 Controller 方法上的 OutputCache,并且数据缓存决策将全部封装在 Model 中。我们将获得更清晰的关注点分离;更高的效率、更短的响应时间和更高的可扩展性;减少对昂贵的数据库操作的依赖。

    关于asp.net - 如何使带有 SqlDependency 的 OutputCache 依赖于每个请求的数据库中的一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9587749/

    相关文章:

    asp.net-mvc - 操作方法参数不为空,尽管它应该是

    SQL Server 2008表变量错误: Must declare the scalar variable "@RESULT"

    SQL Server : ORDER BY variable column CASE statement with NULL values

    asp.net-mvc - ASP.NET MVC 应用程序结构的建议

    c# - MVC 在复杂的 View 模型上添加具有绑定(bind)的表行

    sql-server - 如何在没有日志的情况下删除SQL表中的大数据?

    javascript - 不正确的 DOM 问题

    asp.net - 在 Windows Server 2008 上的 ASP.NET 中使用 Microsoft.Ink

    asp.net - 如何限制ASP.NET中的目录列表访问

    asp.net - 如何在asp.net vnext中使用 Protocol Buffer ?