SQL数据库缓存依赖

SQL缓存依赖,可以将数据库中的数据放入Cache缓存中缓存,既当数据库中有相应的更新,程序也会及时监听到,并获取更新最新的缓存版本。

  • 优点:能直接从缓存中取数据,加快了程序的执行效率。
  • 缺点:不能进行分层,增大了程序的耦合性,难以维护。另外,需要注意的细节很多,稍有不慎,就无法起作用。

下面,上代码。

首先,一个用来测试的简单页面,三个控件,Label1,GridView1,Button1。

样例输出:如果是从数据库中读取数据,则Label1显示:"Come from database".如果是从Cache中取出的数据,则Label1显示:"Come from Cache"

        protected void Page_Load(object sender, EventArgs e)
        {
            //因为只是测试,所以 只在Page_Load中写了代码。
            //每次Button1被点击时,都会进入此事件。
            List<Goods> list = (List<Goods>)Cache["Goods"];
            if (list == null)//判断Cache中是否有数据
            {
                list = new List<Goods>();
                string str = "server=.;database=Practice;integrated security=true;";
                using (SqlConnection sql = new SqlConnection(str))
                {
                    sql.Open();
                    string text = "select g_id,g_name,g_type,g_single from dbo.Goods";
                    
                    using (SqlCommand scmd = new SqlCommand(text, sql))
                    {
                        //下面这句是建立数据库与asp.net之间的缓存依赖
                        SqlCacheDependency depend = new SqlCacheDependency(scmd);
                        using (SqlDataReader dr = scmd.ExecuteReader())
                        {
                            //读取数据
                            while (dr.Read())
                            {
                                Goods goods = new Goods();
                                goods.G_id = dr["g_id"].ToString();
                                goods.G_name = dr["g_name"].ToString();
                                goods.G_type = dr["g_type"].ToString();
                                goods.G_single = (int)dr["g_single"];
                                list.Add(goods);
                            }
                        }
                        //如果,数据库中有更新,则Cache会被清空,并在下一次重新被赋值。(即最新数据)
                        Cache.Insert("Goods", list, depend);
                    }
                }
                Label1.Text = "Come from database";
            }
            else
                Label1.Text = "Come from Cache";
            GridView1.DataSource = list;
            GridView1.DataBind();
        }
注:Button1中没有写任何代码,在此仅作刷新页面使用。

写完aspx页面,还需要在Global.asax中写两句代码。

        //using System.Data.SqlClient;记得加上这个命名空间
        protected void Application_Start(object sender, EventArgs e)
        {
            string str = "server=.;database=Practice;integrated security=true;";//连接字符串必须和前面的一样
            SqlDependency.Start(str);//开始监听
        }

        protected void Application_End(object sender, EventArgs e)
        {
            string str = "server=.;database=Practice;integrated security=true;";
            SqlDependency.Stop(str);//结束监听
        }


上面这些做完了,还需要为使用的数据库执行下面一句代码。

ALTER DATABASE 数据库名 SET ENABLE_BROKER;   //允许监听,默认为关闭。

输出:当程序首次运行,Label1会显示"Come from database"

此时,再点击Button1,Label1会显示"Come from Cache",如果数据库中的数据不改变的话,则不管怎么点Button1都不会改变。

那么,当改变数据库中的数据时,再点击Button1,则Label1.Text会改变为"Come from database"。

下面,是建立Sql数据库缓存依赖需要注意的地方。

  1. 必须设置完全限定名称的数据表。即表名前面需要加所有者,如dbo.test
  2. 必须明确设置所访问数据库列名称,不能使用“*”。
  3. 必须保证不是聚合函数。如COUNT、MAX等。

(不知道为什么,我在学校没有遵守1.2条也可以。但是,回到家再做,则不行。)

最后,学习笔记,如需转载,请注明出处。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值