我正在与SQLDependency
班级一起探索查询通知。构建一个简单的工作示例很容易,但我觉得我错过了一些东西。一旦我跳过一个简单的单表/单依赖示例,我就想知道 如何确定哪个依赖触发了我的回调?
我在解释时遇到了一些麻烦,所以我在下面提供了一个简单的示例。当AChange()
被调用时,我无法查看依赖项中的 sql,并且我没有对关联缓存对象的引用。
那么男孩该怎么办呢?
- 选项 1 - 为我要跟踪的每个对象创建一个不同的函数,并在回调中硬编码缓存键(或相关信息)。这感觉很脏,并且消除了在不部署新代码的情况下添加新缓存项的可能性——ewww。
- 选项 2 - 使用 Dependency
Id
属性和并行跟踪结构
我只是错过了什么吗?这是SQLDependency
结构上的缺陷吗?我已经查看了 20 篇关于该主题的不同文章,所有文章似乎都有相同的漏洞。建议?
代码示例
public class DependencyCache{
public static string cacheName = "Client1";
public static MemoryCache memCache = new MemoryCache(cacheName);
public DependencyCache() {
SqlDependency.Start(connString);
}
private static string GetSQL() {
return "select someString FROM dbo.TestTable";
}
public void DoTest() {
if (memCache["TEST_KEY"] != null ) {
Debug.WriteLine("resources found in cache");
return;
}
Cache_GetData();
}
private void Cache_GetData() {
SqlConnection oConn;
SqlCommand oCmd;
SqlDependency oDep;
SqlDataReader oRS;
List<string> stuff = new List<string>();
CacheItemPolicy policy = new CacheItemPolicy();
SqlDependency.Start(connString);
using (oConn = new SqlConnection(connString) ) {
using (oCmd = new SqlCommand(GetSQL(), oConn) ) {
oDep = new SqlDependency(oCmd);
oConn.Open();
oRS = oCmd.ExecuteReader();
while(oRS.Read() ) {
resources.Add( oRS.GetString(0) );
}
oDep.OnChange += new OnChangeEventHandler (AChange);
}
}
memCache.Set("TEST_KEY", stuff, policy);
}
private void AChange( object sender, SqlNotificationEventArgs e) {
string msg= "Dependency Change \nINFO: {0} : SOURCE {1} :TYPE: {2}";
Debug.WriteLine(String.Format(msg, e.Info, e.Source, e.Type));
// If multiple queries use this as a callback how can i figure
// out WHAT QUERY TRIGGERED the change?
// I can't figure out how to tell multiple dependency objects apart
((SqlDependency)sender).OnChange -= Cache_SqlDependency_OnChange;
Cache_GetData(); //reload data
}
}