SqlCacheDependency / SqlDependency和列

时间:2012-10-03 09:22:52

标签: asp.net sql-server sqlcachedependency

我使用以下代码缓存依赖于“People”表的“Name”列的更改。但是,如果某些其他列(如“地址”列)发生更改,则连续触发并清除缓存。 (带有SQL Server 2008的ASP.NET 4.0。)

public string GetTheVals()
{
    string vals = HttpContext.Current.Cache["TheCacheKey__X"] as string;
    if (vals == null)
    {
        con = GetConnection();
        SqlCommand cmd = new SqlCommand(@"
SELECT Name
FROM dbo.People
", con);            
        con.Open();
        SqlCacheDependency sqlDependency = new SqlCacheDependency(cmd);
        SqlDataReader rdr = null;

        StringBuilder builder = new StringBuilder("");
        rdr = cmd.ExecuteReader();
        while (rdr.Read())
        {
            builder.Append(rdr[0].ToString());
        }
        vals = builder.ToString();

        HttpContext.Current.Cache.Insert("TheCacheKey__X", vals, sqlDependency, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(20));
        CloseConnection(con);
    }
    return vals;
}

为什么当一个不在命令查询中的列值发生变化时会触发它,虽然结果发生变化时会被触发?

  

您还可以将一个委托分配给OnChange事件,该事件将触发   当相关命令的结果发生变化时。

     

http://msdn.microsoft.com/en-us/library/62xk7953.aspx

还需要明确说明列,以便我们了解它将过滤掉表中的其他列,并且不会触发。

  • 那么,为什么需要明确说明列名?
  • 是否仅仅是为了让开发人员了解他们正在做什么(例如使用内部联接时)并避免创建会导致性能最差的依赖项?
  

SELECT语句中的投影列必须是显式的   陈述,表名必须用两部分名称限定。注意   这意味着语句中引用的所有表必须在   相同的数据库。

     

该语句可能不使用星号(*)或table_name。*语法   指定列。

     

该语句不得包含子查询,外连接或自连接。

     

http://msdn.microsoft.com/en-us/library/ms181122(v=sql.105).aspx

2 个答案:

答案 0 :(得分:3)

然而,根据MS help

  

SQL Server在其中一个订阅时发送订阅的查询通知   发生以下事件:

     
      
  • 查询结果中包含的行可能已更改。

  •   
  • 订阅到期。

  •   
  • 服务器重新启动。

  •   
  • 无法创建查询通知订阅(例如,   SELECT语句不符合中指定的要求   创建通知查询。

  •   
  • 服务器负载很重。

  •   
  • 删除或修改订阅所依赖的对象。

  •   
     

请注意,SQL Server 可能会生成查询通知以响应   不更改数据的事件,或响应更改的事件   实际上不会影响查询的结果。例如,时   UPDATE语句更改查询返回的行之一   即使对行的更新没有改变,通知也可能会触发   查询结果中的列

答案 1 :(得分:1)

当我使用SQL Cache依赖时,我注意到你应该考虑很多要点。

如果您希望在数据库中打开缓存表 AspNet_SqlCacheTablesForChangeNotification ,则其中一个您无法根据列名缓存表。

  

SELECT TOP 1000 [tableName]         [notificationCreated]         [changeId]     FROM [dbo]。[AspNet_SqlCacheTablesForChangeNotification]

你会注意到什么时候会触发changeId,更新,插入或删除,这将触发刷新缓存。

总是在命令通知中检查您的查询非常重要,如上所述,不支持许多查询。

关心并希望它有所帮助。