Son*_*ate 14 .net caching sqldependency
我试图让System.Runtime.Caching命名空间中包含的新SqlChangeMonitor功能工作,并得到一些意想不到的结果.
我有一个简单的控制台应用程序设置为:
static void Main(string[] args)
{
var cacher = new Cacher();
cacher.Start();
Console.WriteLine("Watching for changes...");
while (true)
{
if (cacher.HasData)
{
Console.Write(".");
Thread.Sleep(1000);
}
else
{
Console.WriteLine();
Console.WriteLine("Cache EMPTY!");
Console.ReadLine();
cacher.Start();
}
}
}
Run Code Online (Sandbox Code Playgroud)
Cacher类定义为:
public class Cacher
{
private MemoryCache cache = new MemoryCache("test");
public Boolean HasData
{
get { return cache.Contains("data"); }
}
public void Start()
{
var connectionString = "Data Source=.;Initial Catalog=CachingTest;Integrated Security=True";
var list = new NameValueCollection();
var policy = new CacheItemPolicy();
SqlDependency.Start(connectionString);
using (var connection = new SqlConnection(connectionString))
{
using (var command = new SqlCommand("SELECT * FROM dbo.Table_1", connection))
{
var dependency = new SqlDependency(command);
connection.Open();
var reader = command.ExecuteReader();
while (reader.Read())
{
list.Add(reader["Name"].ToString(), reader["Value"].ToString());
}
var monitor = new SqlChangeMonitor(dependency);
policy.ChangeMonitors.Add(monitor);
}
cache.Add("data", list, policy);
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行代码时,我得到等待消息和一个点'.',一秒延迟,然后是"缓存空"消息.按一个键重新启动循环后重复此操作.
我错过了什么?
Son*_*ate 14
事实证明,我原来的问题是由SELECT语句中使用星号(*)通配符引起的.一旦列出了列名,缓存就开始正常工作.
我还希望在更新/清除缓存时接收代码通知.ChangeMonitor的NotifyOnChanged方法不起作用,因为它是供内部使用的.
事实证明,CacheItemPolicy对象有两个回调:RemovedCallback和UpdateCallback可用于这些目的.只需将这些属性设置为代码中的方法并执行所需的操作即可.
由于缺乏对SqlChangeMonitor可用文档,我希望这可能有助于给其他任何人遇到了这些问题.
| 归档时间: |
|
| 查看次数: |
6276 次 |
| 最近记录: |