【发布时间】:2019-06-27 02:37:13
【问题描述】:
几乎我读过的每个教程似乎都错误地设置了 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);
}
(不包括检查缓存是否为空的代码,因为这只是设置。我只是想显示缓存的设置)
这似乎无需定义查询中涉及哪些表并在每个表上进行复杂的触发器即可工作。它只是工作。
更令我惊讶的是,查询规则有通知:
- Creating a Query for Notification(找不到比 2008 年更新的文档)似乎不适用。我打算在我的 SQL 中做一个 TOP,它仍然有效。
对于一个测试,我让它运行一个查询 1000 次,涉及一个名为“设置”的表。然后我更新表中的一个值并重复查询。
我在 Profiler 中查看任何涉及“设置”一词的查询,我看到查询只执行了 1 次(以设置缓存),然后出现更新语句,然后再次重新执行查询(缓存失效,查询再次运行)
我担心在 2-3 个小时的努力中寻找正确的方法来做到这一点,我错过了一些东西,真的就这么简单吗?
我真的可以只输入我想要的任何查询并且它会正常工作吗?我正在寻找我正在做一些危险/非标准的事情或我遗漏的任何小字的任何指示
【问题讨论】:
标签: c# asp.net sql-server sql-server-2012 sqlcachedependency