关于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());
}
}
本文来自博客园,作者:码农阿亮,转载请注明原文链接:https://www.cnblogs.com/wml-it/p/15813373.html
技术的发展日新月异,随着时间推移,无法保证本博客所有内容的正确性。如有误导,请大家见谅,欢迎评论区指正!
开源库地址,欢迎点亮:
GitHub:https://github.com/ITMingliang
Gitee: https://gitee.com/mingliang_it
GitLab: https://gitlab.com/ITMingliang
建群声明: 本着技术在于分享,方便大家交流学习的初心,特此建立【编程内功修炼交流群】,为大家答疑解惑。热烈欢迎各位爱交流学习的程序员进群,也希望进群的大佬能不吝分享自己遇到的技术问题和学习心得!进群方式:扫码关注公众号,后台回复【进群】。
![](https://images.cnblogs.com/cnblogs_com/wml-it/2196906/o_230823011905_wxgzhss.png)