博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Cache 基于SQL 数据库 的缓存依赖 轮询机制详解
阅读量:5375 次
发布时间:2019-06-15

本文共 3252 字,大约阅读时间需要 10 分钟。

首先声明一下如果您还不了解什么是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

 

运行后数据库会发生以下变化:

1. 增加了一个名称为AspNet_SqlCacheTablesForChangeNotification的表
2. Home表中增加了一个触发器

set ANSI_NULLS ONset QUOTED_IDENTIFIER ONgoALTER 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. 增加了几个存储过程  如下图

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

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

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

 

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

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

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

下面是测试代码

 

protected System.Text.StringBuilder sbHtml = new System.Text.StringBuilder();    protected void Page_Load(object sender, EventArgs e)    {        List
list = Cache["homeList"] as List
; if (list == null) { Response.Write("

从数据库中获得的数据

"); HouseEntities houseEntities = new HouseEntities(); list = houseEntities.Home.ToList
(); Cache["homeList"] = list; //基于数据库的缓存依赖 SqlCacheDependency sqldep = new SqlCacheDependency("pubs", "Home"); Cache.Insert("homeList",list,sqldep); } else { Response.Write("

从缓存中获得的数据

"); } foreach (Home item in list) { sbHtml.Append("Id:" + item.Id + "Name:" + item.Name + "Address:" + item.Address + "
"); } }

注意:SqlCacheDependency sqldep = new SqlCacheDependency("pubs", "Home");

第一个参数是配置文件中的<add> 节点下的name 属性的值,第二个参数是表名

运行效果:

1. 第一次访问

2 . 刷新一次

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

4. 刷新一次页面

-------------------------------------------------------------

感谢您看完本篇博文!!!!

互联网产品永远是Beta版,没有做不到的只有想不到的。

李亮和大家共同学习共同进步,如有什么疑问或博文有什么错误知识,请您斧正。
您可以给我发邮件,也可以再文章下面留言我会第一时间回复您。

再次感谢您的观看,祝您身体健康!工作顺利!

原文地址:http://www.cnblogs.com/wlitsoft/archive/2012/06/21/2557787.html

转载于:https://www.cnblogs.com/xust/articles/3302271.html

你可能感兴趣的文章
【VS开发】ATL辅助COM组件开发
查看>>
《演说之禅》I &amp; II 读书笔记
查看>>
thinkphp3.2接入支付宝支付接口(PC端)
查看>>
C#中Monitor和Lock以及区别
查看>>
【NOIP2017】奶酪
查看>>
5.6.3.7 localeCompare() 方法
查看>>
Linux下好用的简单实用命令
查看>>
描绘应用程序级的信息
查看>>
php环境搭建脚本
查看>>
MES架构
查看>>
hdu 2767(tarjan)
查看>>
sklearn之分类模型混淆矩阵和分类报告
查看>>
MySQL各存储引擎
查看>>
项目--简单导出CSV文件
查看>>
Oracle session相关数据字典(一)
查看>>
BZOJ 3399 [Usaco2009 Mar]Sand Castle城堡(贪心)
查看>>
获取元素属性get_attribute
查看>>
在Flex中用Validator检测数字、字符串、Email.
查看>>
[leetcode]4Sum
查看>>
POJ1062 昂贵的聘礼
查看>>