【问题标题】:SqlCacheDependency/SqlDependency and columnsSqlCacheDependency/SqlDependency 和列
【发布时间】:2012-10-25 16:24:55
【问题描述】:

我正在使用以下代码缓存依赖于“人员”表的“名称”列的更改。但是,如果某个其他列(例如地址列)连续发生更改,则依赖项也会触发并清除缓存。 (带有 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

【问题讨论】:

    标签: asp.net sql-server sqlcachedependency


    【解决方案1】:

    然而根据MS help

    SQL Server 在以下情况之一发送订阅查询通知 发生以下事件:

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

    • 订阅到期。

    • 服务器重新启动。

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

    • 服务器负载很重。

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

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

    【讨论】:

      【解决方案2】:

      当我使用 SQL 缓存依赖项时,我注意到您应该考虑的许多要点。

      如果您希望看到您的缓存表在您的数据库中打开 AspNet_SqlCacheTablesForChangeNotification,其中一个您不能根据列名缓存表。

      选择前 1000 个 [tableName] ,[通知创建] ,[更改ID] FROM [dbo].[AspNet_SqlCacheTablesForChangeNotification]

      您会注意到 changeId 何时被触发,在更新、插入或删除时,这将触发缓存被刷新。

      始终在命令通知中检查您的查询非常重要,正如您上面所说的,许多查询不受支持。

      问候并希望它有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多