【状态保持】Cache 基于SQL 数据库 的缓存依赖 轮询机制详解

 

首先声明一下如果您还不了解什么是Cache(缓存)请您先搜一下有关信息然后再看这篇文章。

当数据库中的信息发生变化的时候,应用程序能够获取变化的通知是缓存依赖得以实现的基础。应用程序可以通过两种途径获取数据变化的信息:

  1. 数据库通知  当数据库中的信息发生变化的时候,数据库会主动通知Framework 或者说通知应用程序。
  2. 轮询(今天的重点) 数据库不能通知的时候,应用程序可以主动定期访问数据库(在配置文件中可以配置间隔多长时间访问一次),检查数据是否发生变化。

     第一种 数据库通知是最理想的方式,但是许多数据库都不支持这个方法,SQL server 2005 + 的版本支持这个方法,如果数据库不支持通知机制比如SQL server 2000 数据库 现在主机比较普遍的数据库,那么我们就得通过轮询机制来实现。

     轮询:  使用轮询的话也不可能在重新查一次然后再和以前的数据做比较,如果这样的话如果我一个表里面有1000行数据我要是读100次的话是不是得比较1000 x 100 次,显然这种方法是不可行的,那怎么办捏。大家都学过触发器吧,今天的轮询机制就是通过触发器来实现的。

实现步骤简单分析:
     首先创建一个用于记录监控信息的表,表的字段就两个一个是表名,一个是版本号。然后,对需要监控的变增加一个触发器,当表的内容发生变化的时候进行触发。我们可以用insert delete update 触发器,如果一旦触发以上动作就在把那个监控表的版本号字段加1。
上面的步骤要我们自己动手实现起来很麻烦,没关系跟着微软混是不会吃亏滴,微软早就为我们提供好了一个工具叫Aspnet_regsql.exe 这个工具位于C:\Windows\Microsoft.NET\Framework\v2.0.50727这个路径下(也不一定但是一般就是这个路径)好了有工具了具体怎么用呢?具体帮助请运行Aspnet_regsql /? 查看下面列出本文要用到的参数
  -U 用户名
  -P 密码
  -d 数据库名称,默认为aspnetdb数据库
  -ed 为数据库打开SQL缓存依赖支持
  -dd 关闭数据库的SQL缓存依赖支持
  -et 指定SQL缓存依赖使用的表,需要使用-t指定表名
  -dt 禁用SQL 缓存依赖使用的表,需要使用-t指定表名
  -t 指定表名
  -lt 列出启用缓存依赖的表名
启用数据库House 缓存依赖支持,并对Home表启用缓存依赖,如下:

  aspnet_regsql -S . -E -ed -d House -et -t Home

【状态保持】Cache 基于SQL 数据库 的缓存依赖 轮询机制详解

 

运行后数据库会发生以下变化:
1. 增加了一个名称为AspNet_SqlCacheTablesForChangeNotification的表
2. Home表中增加了一个触发器

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER TRIGGER [Home_AspNet_SqlCacheNotification_Trigger] ON [dbo].[Home]
                       FOR INSERT, UPDATE, DELETE AS BEGIN
                       SET NOCOUNT ON
                       EXEC dbo.AspNet_SqlCacheUpdateChangeIdStoredProcedure N'Home'
                       END

3. 增加了几个存储过程  如下图
【状态保持】Cache 基于SQL 数据库 的缓存依赖 轮询机制详解

下面咱打开它建的那个表看看是什么东东

【状态保持】Cache 基于SQL 数据库 的缓存依赖 轮询机制详解

是不是和开始咱描述的步骤差不多它这还多了一个有关时间的列

ok 下面咱手动修改一个Home表中的数据看看这个监视表有什么变化

 

【状态保持】Cache 基于SQL 数据库 的缓存依赖 轮询机制详解

怎么样 changeId 变了吧!应用程序就是定期查询这个表的变化然后确定是否更新缓存。

数据库配置完毕,在看看网站怎么配置吧!首先,打开web.config加入如下代码  在system.web 节点下

<!-- 基于数据库的缓存依赖 -->
    <caching>
      <sqlCacheDependency enabled="true" pollTime="500">
        <databases>
          <add name="pubs" connectionStringName="pubs" pollTime="500"/>
        </databases>
      </sqlCacheDependency>
    </caching>

其中pollTime 属性 就是应用程序间隔多长时间主动访问一次数据库默认为1分钟,单位ms 注意最低为500ms  这里是为了演示效果明显 设到最低
下面是测试代码

 

protected System.Text.StringBuilder sbHtml = new System.Text.StringBuilder();
    protected void Page_Load(object sender, EventArgs e)
    {
        List<Home> list = Cache["homeList"] as List<Home>;
        if (list == null)
        {
            Response.Write("<h3>从数据库中获得的数据</h3>");
            HouseEntities houseEntities = new HouseEntities();
            list = houseEntities.Home.ToList<Home>();
            Cache["homeList"] = list;
            //基于数据库的缓存依赖
            SqlCacheDependency sqldep = new SqlCacheDependency("pubs", "Home");
            Cache.Insert("homeList",list,sqldep);
        }
        else
        {
            Response.Write("<h3>从缓存中获得的数据</h3>");
        }
        
        foreach (Home item in list)
        {
            sbHtml.Append("Id:" + item.Id + "Name:" + item.Name + "Address:" + item.Address + "<br/>");
        }


    }

注意:SqlCacheDependency sqldep = new SqlCacheDependency("pubs", "Home");
第一个参数是配置文件中的<add> 节点下的name 属性的值,第二个参数是表名

运行效果:

1. 第一次访问

【状态保持】Cache 基于SQL 数据库 的缓存依赖 轮询机制详解

2 . 刷新一次

【状态保持】Cache 基于SQL 数据库 的缓存依赖 轮询机制详解

3. 改一下数据库中的数据

【状态保持】Cache 基于SQL 数据库 的缓存依赖 轮询机制详解

4. 刷新一次页面

【状态保持】Cache 基于SQL 数据库 的缓存依赖 轮询机制详解

转载于:https://www.cnblogs.com/wlitsoft/archive/2012/06/21/2557787.html