ASP.NET MVC 数据库依赖缓存的实现
当数据库中的信息发生变化的时候,应用程序能够获取变化的通知是缓存依赖得以实现的基础。应用程序可以通过轮询获取数据变化的信息,使用轮询的话也不可能重新查一次后再和以前的数据做比较,如果这样的话如果我一个表里面有1000行数据我要是读100次的话是不是得比较1000 x 100 次,显然这种方法是不可行的,那怎么办呢?大家都学过触发器吧,实现数据库依赖缓存的轮询机制就是通过触发器来实现的。
实现步骤简单分析:
首先创建一个用于记录监控信息的表,表的字段就两个一个是表名,一个是版本号。然后,对需要监控的变增加一个触发器,当表的内容发生变化的时候进行触发。我们可以用insert delete update 触发器,如果一旦触发以上动作就在把那个监控表的版本号字段加1。
上面的步骤要我们自己动手实现起来很麻烦,但微软早就为我们提供好了一个工具叫Aspnet_regsql.exe 这个工具位于C:\Windows\Microsoft.NET\Framework\v4.0.30319这个路径下(也不一定但是一般就是这个路径)好了有工具了具体怎么用呢?打开cmd,输入以下命令行切换到aspnet_regsql.exe的运行根目录。
cd C:\Windows\Microsoft.NET\Framework\v4.0.30319
具体帮助请执行命令aspnet_regsql /? 查看下面列出本文要用到的参数
- -S 服务器
- -E 使用当前Windows凭据进行身份验证
- -U 用户名
- -P 密码
- -d 数据库名称,默认为aspnetdb数据库
- -ed 为数据库打开SQL缓存依赖支持
- -dd 关闭数据库的SQL缓存依赖支持
- -et 指定SQL缓存依赖使用的表,需要使用-t指定表名
- -dt 禁用SQL 缓存依赖使用的表,需要使用-t指定表名
- -t 指定表名
- -lt 列出启用缓存依赖的表名
然后就可以通过命令为SQL缓存依赖项启用House数据库以及Home表,具体命令如下:
aspnet_regsql -S . -E -ed -d House -et -t Home

附:如果已为SQL缓存依赖项启用House数据库,只是单纯为SQL缓存依赖项启用Home表,就可以执行以下命令:
aspnet_regsql -S . -E -d House -et -t Home
为SQL缓存依赖项禁用Home表则执行以下命令:
aspnet_regsql -S . -E -d House -dt -t Home
为SQL缓存依赖项启用House数据库以及Home表后数据库会发生以下变化:
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. 增加了几个存储过程 如下图所示:

打开AspNet_SqlCacheTablesForChangeNotification的表后会发现以下几个字段:

基本上和开始描述的步骤差不多,它这还多了一个有关时间的列,下面手动修改一个Home表中的数据看看这个监视表有什么变化。

结果 changeId 数值改变了!应用程序就是定期查询这个表的变化然后确定是否需要更新缓存。
数据库配置完毕后,在ASP.NET MVC项目中进行配置,打开Web.config在system.web 节点下加入以下代码:
<!-- 基于数据库的缓存依赖 -->
<caching>
<sqlCacheDependency enabled="true">
<databases>
<add name="PostCacheDependency" connectionStringName="SqlConnectString" pollTime="6000"/>
</databases>
</sqlCacheDependency>
</caching>
其中 pollTime 属性就是应用程序间隔多长时间主动访问一次数据库默认为1分钟,最低为500ms,单位为ms。
实现数据库依赖缓存的核心代码在缓存类添加即可(请根据需求进行修改):
SqlCacheDependency dependencies = string.IsNullOrEmpty(tableName) ? null : new SqlCacheDependency("PostCacheDependency", tableName);
if (cacheTime != )
{
caches.Insert(key, data, dependencies, DateTime.UtcNow.AddMinutes(cacheTime), Cache.NoSlidingExpiration);//System.Web.Caching.Cache.NoAbsoluteExpiration
}
else
{
caches.Insert(key, data, dependencies, System.Web.Caching.Cache.NoAbsoluteExpiration, new TimeSpan(, , ));
}
absoluteExpiration:表示所插入对象将到期并被从缓存中移除的时间。 要避免可能的本地时间问题(例如从标准时间改为夏时制),请使用 System.DateTime.UtcNow 而不是 System.DateTime.Now 作为此参数值。 如果使用绝对到期,则 slidingExpiration 参数必须为 System.Web.Caching.Cache.NoSlidingExpiration。
slidingExpiration:表示最后一次访问所插入对象时与该对象到期时之间的时间间隔。 如果该值等效于 20 分钟,则对象在最后一次被访问 20 分钟之后将到期并被从缓存中移除。简单来说,就是自访问起的20分钟内不被访问就移除缓存。如果使用可调到期,则 absoluteExpiration 参数必须 System.Web.Caching.Cache.NoAbsoluteExpiration。
ASP.NET MVC 数据库依赖缓存的实现的更多相关文章
- ASP.NET MVC 数据库依赖缓存
ASP.NET MVC 数据库依赖缓存 问题背景 最近做一个非常简单的功能,就是使用ajax请求的方式从服务端请求一段下拉表的数据. 以前也有做过这个功能,只不过这次做这个功能的时候冒出了一个想法 ...
- 初遇 Asp.net MVC 数据库依赖缓存那些事儿
问题背景: 最近做一个非常简单的功能,就是使用ajax请求的方式从服务端请求一段下拉表的数据. 以前也有做过这个功能,只不过这次做这个功能的时候冒出了一个想法: 我请求的这段数据它是一段相对比较固定的 ...
- ASP.NET MVC IOC依赖注入之Autofac系列(二)- WebForm当中应用
上一章主要介绍了Autofac在MVC当中的具体应用,本章将继续简单的介绍下Autofac在普通的WebForm当中的使用. PS:目前本人还不知道WebForm页面的构造函数要如何注入,以下在Web ...
- 如何在C#Asp.Net MVC使用Redis缓存
为什么要在Asp.Net MVC项目中使用Redis缓存呢?系统是按照高负载高并发来设计的,这就涉及服务器集群带来的问题,Session存储验证码或登录信息,在系统登录的时候,可能展示登录界面和存储验 ...
- YII2数据库依赖缓存
首先配置一下缓存,自己选择是用文件缓存还是数据库缓存等. 'cache' => [ 'class' => 'yii\caching\FileCache', ], 然后就可以通过 Yii:: ...
- 使用Donut Caching和Donut Hole Caching在ASP.NET MVC应用中缓存页面
Donut Caching是缓存除了部分内容以外的整个页面的最好的方式,在它出现之前,我们使用"输出缓存"来缓存整个页面. 何时使用Donut Caching 假设你有一个应用程序 ...
- 007.ASP.NET MVC控制器依赖注入
原文链接:http://www.codeproject.com/Articles/560798/ASP-NET-MVC-Controller-Dependency-Injection-for-Be 前 ...
- 实现asp.net mvc页面二级缓存,提高访问性能
实现的mvc二级缓存的类 //Asp.Net MVC视图页面二级缓存 public class TwoLevelViewCache : IViewLocationCache { private rea ...
- Asp.net Mvc 数据库上下文初始化器
在Asp.net Mvc 和Entity FrameWork程序中,如果数据库不存在,EF默认的行为是新建一个数据库.如果模型类与已有的数据库不匹配的时候,会抛出一个异常. 通过指定数据库上下文对象初 ...
随机推荐
- android canvas d
(以下转自:http://blog.csdn.net/longyi_java/article/details/6930480) 1.基本的绘制图片方法 //Bitmap:图片对象,left:偏移左边的 ...
- Flex 布局教程:语法篇[转]
网页布局(layout)是CSS的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 + float属性.它对于那些特殊布局非常不方便,比如,垂直居中 ...
- nodejs模块——fs模块
fs模块用于对系统文件及目录进行读写操作. 一.同步和异步 使用require('fs')载入fs模块,模块中所有方法都有同步和异步两种形式. 异步方法中回调函数的第一个参数总是留给异常参数(exce ...
- Java实现点击一个Jlabel增加一个Jlabel的小功能
当界面生成以后,自己想做一个点击一个Jlabel增加一个Jlabel,即类似于QQ的添加好友以后可以及时的加进一个好友.自己做了好久,发现不能及时刷新.在网上查了一下,然后自己研究了一小会.发现需要v ...
- UVALive 4997 ABCD Tiles --DFS
题意: NxN的地图,上面有A颜色的瓷砖以及一些空格点,要用B,C,D颜色去填充这些空格,只能十字形的填充,还要保证共角或共边的格子不能是相同颜色,求一种字典序最小的填充方法,如果不能,输出" ...
- UESTC 764 失落的圣诞节 --RMQ/线段树
题意:n种物品,每种物品对不同的人都有不同的价值,有三个人选,第一个为普通学生,第二个是集,第三个是祈,集和祈可以选一样的,并且还会获得加分,集和祈选的普通学生都不能选,问三个人怎样选才能使总分最高. ...
- java 24 - 8 GUI之创建四则运算计算器(未校验版)
这个是用NetBeans软件制作的,因为这个软件制作GUI任务比较方便 通过拖拽控件生成的窗体:(红色的名称是更改后的控件名称) 拉拽好布局后,要进行的步骤: A:更改想要进行操作的控件的名称(右键控 ...
- CTF中那些脑洞大开的加密(1)
0x01 目录 各种文本加密 Shell 1 2 3 4 5 6 7 8 9 10 11 12 换位加密: 1.栅栏密码(Rail-fence Cipher) ...
- Oracle 使用MERGE INTO 语句更新数据
/*Merge into 详细介绍MERGE语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句.通过MERGE语句,根据一张表或子查询的连接条件对另外一张表进行查询,连接条件匹配 ...
- HTML 学习笔记 JavaScript (实现)
HTML中的脚本 必须位于<script></script>标签之间 脚本可被放置在HTML页面的<body>和<head>部分中 <script ...