关于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());
        }
    }
posted @ 2022-01-17 14:32  码农阿亮  阅读(56)  评论(0编辑  收藏  举报