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