首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SqlCacheDependency/SqlDependency和列

SqlCacheDependency/SqlDependency和列
EN

Stack Overflow用户
提问于 2012-10-03 09:22:51
回答 2查看 2.3K关注 0票数 4

我使用以下代码缓存"People“表的"Name”列的更改。但是,在一行中,如果其他列(如Address列)发生更改,则还会触发和清除缓存。(ASP.NET 4.0与Server 2008。)

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

发布于 2012-10-25 08:16:27

然而,根据女士帮助的说法:

当发生下列事件之一时,Server将发送订阅的查询通知:

  • 查询结果中包含的行可能已更改。
  • 订阅到期。
  • 服务器重新启动。
  • 无法创建查询通知订阅(例如,SELECT语句不符合为通知创建查询时指定的要求。
  • 服务器负载很重。
  • 订阅所依赖的对象被删除或修改。

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

票数 3
EN

Stack Overflow用户

发布于 2012-10-25 08:24:55

当我使用SQL依赖项时,我注意到了许多您应该考虑的问题。

其中之一,您不能缓存一个表取决于列名,如果您想看到您的缓存表打开AspNet_SqlCacheTablesForChangeNotification在您的数据库。

从dbo.AspNet_SqlCacheTablesForChangeNotification中选择TOP 1000 tableName、notificationCreated、changeId

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

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

希望它能帮上忙。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12705454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档