我读过的几乎每个教程似乎都错误地设置了SqlCacheDependency。我相信他们通常会将过时的轮询方法与查询通知方法混为一谈。
以下是众多示例中的两个:
根据我的测试,如果您使用的是代理(MSSQL 2015+),则不需要进行任何.config
更改,也不需要进行任何 SqlCacheDependencyAdmin 调用(不需要定义表等)。
我简化只是这样做......
SqlDependency.Start(connString)
...
queryString = "SELECT ...";
cacheName = "SqlCache" + queryString.GetHashCode();
...
using (var connection = new SqlConnection(connString))
{
connection.Open();
var cmd = new SqlCommand(queryString, connection)
{
Notification = null,
NotificationAutoEnlist = true
};
var dependency = new SqlCacheDependency(cmd);
SqlDataReader reader = cmd.ExecuteReader();
try
{
while (reader.Read())
{
// Set the result you want to cache
data = ...
}
}
finally
{
reader.Close();
}
HostingEnvironment.Cache.Insert(cacheName, data, dependency);
}
(不包括检查缓存是否为空的代码,因为这只是设置。我只想显示缓存的设置)
这似乎无需定义查询中涉及哪些表并在每个表上进行复杂的触发器即可工作。它只是工作。
更令我惊讶的是,查询规则有通知:
- 创建通知查询(找不到比 2008 年更新的文档)似乎不适用。我打算在我的 SQL 中做一个 TOP 并且它仍然有效。
对于测试,我让它运行一个查询 1000 次,涉及一个名为“设置”的表。然后我更新表中的值并重复查询。
我在 Profiler 中查看任何涉及“设置”一词的查询,我看到查询只执行了 1 次(以设置缓存),然后发生更新语句,然后再次重新执行查询(缓存已失效,查询再次运行)
我担心在 2-3 个小时的努力中寻找正确的方法来做到这一点,我错过了一些东西,真的就这么简单吗?
我真的可以只输入我想要的任何查询并且它会起作用吗?我正在寻找我正在做一些危险/非标准的事情的任何指示,或者我遗漏的任何小字体