我使用以下代码缓存依赖于“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事件,该事件将触发 当相关命令的结果发生变化时。
还需要明确说明列,以便我们了解它将过滤掉表中的其他列,并且不会触发。
SELECT语句中的投影列必须是显式的 陈述,表名必须用两部分名称限定。注意 这意味着语句中引用的所有表必须在 相同的数据库。
该语句可能不使用星号(*)或table_name。*语法 指定列。
该语句不得包含子查询,外连接或自连接。
http://msdn.microsoft.com/en-us/library/ms181122(v=sql.105).aspx
答案 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,更新,插入或删除,这将触发刷新缓存。
总是在命令通知中检查您的查询非常重要,如上所述,不支持许多查询。
关心并希望它有所帮助。