关于SqlDependency使用缓存Cache的案例
CacheItemUpdateCallback和CacheItemRemoveCallback区别
- CacheItemUpdateCallback 缓存数据移除之前调用;
- CacheItemRemoveCallback 缓存数据移除之后调用;
案例分析 :
public class Program
{
static void Main(string[] args)
{
Cache cache = HttpRuntime.Cache;
System.Data.SqlClient.SqlDependency.Start(@"Server=127.0.0.1;Database=test;uid=sa;pwd=123;");
// 创建缓存依赖
SqlConnection conn = new SqlConnection(@"Server=127.0.0.1;Database=test;uid=sa;pwd=123;");
SqlCommand command = new SqlCommand("select Id,name from dbo.students", conn);
SqlCacheDependency dependency = new SqlCacheDependency(command); //注意,创建的command与SqlCacheDependency绑定要在command执行之前
SqlDataAdapter adapter = new SqlDataAdapter(command);
DataSet ds = new DataSet();
adapter.Fill(ds); //这里要特别注意,Fill才是真正执行
//CacheItemRemoveCallback 缓存数据移除之后调用;
//CacheItemRemovedCallback callback = new CacheItemRemovedCallback(RemovedCallback);
//cache.Insert("DD", "数据库依赖测试", dependency, DateTime.Now.AddDays(1), TimeSpan.Zero, CacheItemPriority.Default, callback);
//CacheItemUpdateCallback 缓存数据移除之前调用;
CacheItemUpdateCallback callback = new CacheItemUpdateCallback(UpdateCallback);
cache.Insert("DD", "数据库依赖测试", dependency, DateTime.Now.AddDays(1), TimeSpan.Zero, callback);
Console.WriteLine(cache["DD"]);
Thread.Sleep(15000); //暂停15秒给你更改一下数据库
if (cache["DD"] == null)
{
Console.WriteLine("数据库已经修改过了!");
}
Console.ReadKey();
System.Data.SqlClient.SqlDependency.Stop(@"Server=127.0.0.1;Database=test;uid=sa;pwd=123;");
}
//remove callback
public static void RemovedCallback(string key, object value, CacheItemRemovedReason reason)
{
Console.WriteLine("缓存被移除!");
Console.WriteLine(reason.ToString());
}
//update callback
public static void UpdateCallback(string key, CacheItemUpdateReason reason, out object expensiveObject, out CacheDependency dependency, out DateTime absoluteExpiration, out TimeSpan slidingExpiration)
{
// key:要从缓存中移除的项的标识符。
// reason:要从缓存中移除项的原因。
// expensiveObject:此方法返回时,包含含有更新的缓存项对象。
// dependency:此方法返回时,包含定义项对象和文件、缓存键、文件或缓存键的数组或另一个 System.Web.Caching.CacheDependency 对象之间的依赖项的对象。
// absoluteExpiration:此方法返回时,包含对象的到期时间。
// slidingExpiration:此方法返回时,包含对象的上次访问时间和对象的到期时间之间的时间间隔。
expensiveObject = null;
dependency = null;
absoluteExpiration = DateTime.Now;
slidingExpiration = TimeSpan.Zero;
Console.WriteLine("缓存马上被移除!");
//但是现在还有没有呢?输出试试
Console.WriteLine(HttpRuntime.Cache["DD"]);
Console.WriteLine(reason.ToString());
}
}