ASP.NET MVC 数据库依赖缓存的实现
2016-04-19 22:30
567 查看
当数据库中的信息发生变化的时候,应用程序能够获取变化的通知是缓存依赖得以实现的基础。应用程序可以通过轮询获取数据变化的信息,使用轮询的话也不可能重新查一次后再和以前的数据做比较,如果这样的话如果我一个表里面有1000行数据我要是读100次的话是不是得比较1000 x 100 次,显然这种方法是不可行的,那怎么办呢?大家都学过触发器吧,实现数据库依赖缓存的轮询机制就是通过触发器来实现的。
实现步骤简单分析:
首先创建一个用于记录监控信息的表,表的字段就两个一个是表名,一个是版本号。然后,对需要监控的变增加一个触发器,当表的内容发生变化的时候进行触发。我们可以用insert delete update 触发器,如果一旦触发以上动作就在把那个监控表的版本号字段加1。
上面的步骤要我们自己动手实现起来很麻烦,但微软早就为我们提供好了一个工具叫Aspnet_regsql.exe 这个工具位于C:\Windows\Microsoft.NET\Framework\v4.0.30319这个路径下(也不一定但是一般就是这个路径)好了有工具了具体怎么用呢?打开cmd,输入以下命令行切换到aspnet_regsql.exe的运行根目录。
具体帮助请执行命令aspnet_regsql /? 查看下面列出本文要用到的参数
-S 服务器
-E 使用当前Windows凭据进行身份验证
-U 用户名
-P 密码
-d 数据库名称,默认为aspnetdb数据库
-ed 为数据库打开SQL缓存依赖支持
-dd 关闭数据库的SQL缓存依赖支持
-et 指定SQL缓存依赖使用的表,需要使用-t指定表名
-dt 禁用SQL 缓存依赖使用的表,需要使用-t指定表名
-t 指定表名
-lt 列出启用缓存依赖的表名
然后就可以通过命令为SQL缓存依赖项启用[b]House数据库以及Home表,具体命令如下:[/b]
![](https://images2015.cnblogs.com/blog/820134/201604/820134-20160419215857804-820331135.jpg)
附:如果已为SQL缓存依赖项启用House数据库,只是单纯为SQL缓存依赖项启用Home表,就可以执行以下命令:
为SQL缓存依赖项禁用Home表则执行以下命令:
为SQL缓存依赖项启用House数据库以及Home表后数据库会发生以下变化:
1. 增加了一个名称为AspNet_SqlCacheTablesForChangeNotification的表
2. Home表中增加了一个触发器
3. 增加了几个存储过程 如下图所示:
![](https://images2015.cnblogs.com/blog/820134/201604/820134-20160419215923851-1026478417.jpg)
打开AspNet_SqlCacheTablesForChangeNotification的表后会发现以下几个字段:
![](https://images2015.cnblogs.com/blog/820134/201604/820134-20160419220112023-1772232759.jpg)
基本上和开始描述的步骤差不多,它这还多了一个有关时间的列,下面手动修改一个Home表中的数据看看这个监视表有什么变化。
![](https://images2015.cnblogs.com/blog/820134/201604/820134-20160419220102476-1049569896.jpg)
结果 changeId 数值改变了!应用程序就是定期查询这个表的变化然后确定是否需要更新缓存。
数据库配置完毕后,在ASP.NET MVC项目中进行配置,打开Web.config在system.web 节点下加入以下代码:
其中 pollTime 属性就是应用程序间隔多长时间主动访问一次数据库默认为1分钟,最低为500ms,单位为ms。
实现数据库依赖缓存的核心代码在缓存类添加即可(请根据需求进行修改):
absoluteExpiration:表示所插入对象将到期并被从缓存中移除的时间。 要避免可能的本地时间问题(例如从标准时间改为夏时制),请使用 System.DateTime.UtcNow 而不是 System.DateTime.Now 作为此参数值。 如果使用绝对到期,则 slidingExpiration 参数必须为 System.Web.Caching.Cache.NoSlidingExpiration。
slidingExpiration:表示最后一次访问所插入对象时与该对象到期时之间的时间间隔。 如果该值等效于 20 分钟,则对象在最后一次被访问 20 分钟之后将到期并被从缓存中移除。简单来说,就是自访问起的20分钟内不被访问就移除缓存。如果使用可调到期,则 absoluteExpiration 参数必须 System.Web.Caching.Cache.NoAbsoluteExpiration。
实现步骤简单分析:
首先创建一个用于记录监控信息的表,表的字段就两个一个是表名,一个是版本号。然后,对需要监控的变增加一个触发器,当表的内容发生变化的时候进行触发。我们可以用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缓存依赖项启用[b]House数据库以及Home表,具体命令如下:[/b]
aspnet_regsql -S . -E -ed -d House -et -t Home
![](https://images2015.cnblogs.com/blog/820134/201604/820134-20160419215857804-820331135.jpg)
附:如果已为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. 增加了几个存储过程 如下图所示:
![](https://images2015.cnblogs.com/blog/820134/201604/820134-20160419215923851-1026478417.jpg)
打开AspNet_SqlCacheTablesForChangeNotification的表后会发现以下几个字段:
![](https://images2015.cnblogs.com/blog/820134/201604/820134-20160419220112023-1772232759.jpg)
基本上和开始描述的步骤差不多,它这还多了一个有关时间的列,下面手动修改一个Home表中的数据看看这个监视表有什么变化。
![](https://images2015.cnblogs.com/blog/820134/201604/820134-20160419220102476-1049569896.jpg)
结果 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 != 0) { 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(0, 20, 0)); }
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 Core的配置(2):配置模型详解
- CocoasPod与GitHub的区别
- 实验四 使用ASP.NET内置对象 总结
- 实验三 使用ASP.NET常用服务器控件 总结
- 实验一 ASP.NET应用环境配置 总结
- 配置visual studio code进行asp.net core rc2的开发(转载jeffreywu)
- 配置visual studio code进行asp.net core rc2的开发
- 【Spring实战】—— 13 AspectJ注解切面
- 如何给你的ASP.NET页面添加HelpPage
- 如何给你的ASP.NET页面添加HelpPage
- ASP.NET MVC之Session State性能问题(七)
- ASP.NET后台跳转保留原有编码的中文参数
- AspNet Mvc 路由解析中添加.html 等后缀 出现404错误的解决办法
- asp.net细节注意
- asp.net-DirectoryEntry基本操作入门
- 利用ResultFilter实现asp.net mvc3 页面静态化
- ExtJs、ASP.net运用Linq to SQL与SQL储存过程交互
- Raspberry安装telnet并使用
- .NET平台 C# ASP.NET
- uploadfy 上传IO Error 解决办法