我用ASP.NET缓存之SQL数据缓存依赖(SqlCacheDependency)
【名词解释】
缓存(Cache)依赖,大白话解释就是缓存是否更新依赖于其它Object。那么SqlCacheDependency指的就是Cache的数据更新依赖于SQL Server数据库表的变化( 行级别更改)或者SQL 查询结果的变化。
以前也总结过缓存的使用
页面输出缓存:我用ASP.NET缓存之OutputCache
数据缓存:我用ASP.NET缓存之数据缓存
但是对缓存依赖还是很模糊,前阵子有幸在项目中实际运用了此类。现在结合自己的实际以及和网上大牛的经验,给大家分享一下。
【使用背景】
首先你必须用ASP.Net和SQL Server开发应用,也就是SqlCacheDependency是基于微软的那套体制。同学,如果你不是从事Net开发,先给个赞再Skip吧。
缓存是用来提高应用性能,降低服务器压力。适用于数据不易变,数据易通用的情景, 对于动态查询数据,例如数据分析,最好放弃使用缓存。
【我的代码】
SqlCacheDependency通俗的说利用SQL Server的通信机制,当数据表发生变化时,通知应用程序时删除原有的缓存,更新新的数据。
首先需要检查SqlServer是否启用Service Broker。
Select DATABASEpRoPERTYEX('数据库名称','IsBrokerEnabled') -- 1 表示已经启用 0 表示没有启用
启用语句
ALTER DATABASE 数据库名称 SET ENABLE_BROKER;
运行启用语句,会出现假死情况,不要紧,停止查询,重新查询一次就可以。
上面这些来自于网上的一些经验,个人在实际中并没有出现这些情况,状态=0 ,仍然可以使用。我用的是SQL Serve2008,个人觉得高版本的Sql Server 已经不在将这些作为必须条件(个人观点,不同意见,欢迎讨论)。毕竟Net开发走的是一条傻瓜化编程道路。
接下来就是配置数据库缓存通知。两种方法(MSDN),个人建议采用第二种。
第一种利用aspnet_regsql.exe(位于Windows\Microsoft.NET\Framework\[版本]文件夹中) 工具配置数据库和表开启缓存通知功能。你只需要记住如下命令就能开启:
aspnet_regsql -S localhost -E -d RWWW -ed -t Options -et
每个命令代表什么含义,网上有详细的解释。有兴趣的同学可以去了解。运行命令后,配置就可以。这里特别需要注意大小写,笔者在开发中就将表名全部弄成大写,结果花了一个小时的时间,程序始终运行不起来,一直在报错,提示没有为SQL缓存通知启用数据库。结果最后才发现大小写不对。
第二种就是利用SqlCacheDependencyAdmin类
SqlCacheDependencyAdmin.EnableNotifications(connectionString); //启动数据库的数据缓存依赖功能
SqlCacheDependencyAdmin.EnableTableForNotifications(connectionString, table); //启用数据表缓存
将此两行代码放入Global中Start方法中即可。
接下来配置配置文件。
<!--启动缓存依赖,每5秒轮询一次-->
<sqlCacheDependency enabled="true" pollTime="5000">
<databases>
<add name="WWWAccount" connectionStringName="ConnectionString" pollTime="5000"/>
</databases>
</sqlCacheDependency>
</caching>
这里基本就是固定格式,必须这样配置才可以。
最后将缓存加入代码中即可,废话不多说,直接上代码。开发中用到了EF的东东。
//判断是否已缓存
if (System.Web.HttpContext.Current.Cache["Link"] == null)
{
//如果没有缓存 重新获取数据
var links = db.WWW_Link.AsQueryable();
//添加到缓存中
System.Web.HttpContext.Current.Cache.Insert(
"Link",
links,
new SqlCacheDependency("WWWAccount", "WWW_Link")
);
//返回数据
return links;
}
//如果已经缓存 返回缓存数据
return System.Web.HttpContext.Current.Cache["Link"] as IQueryable<WWW_Link>;
当表WWW_Link发生变化时,Cache["Link"]会自动更新。这里主意SqlCacheDependency 的第一个参数,它等于App.config中节点name=WWWAccount。
我用ASP.NET缓存之SQL数据缓存依赖(SqlCacheDependency)的更多相关文章
- cache应用(asp.net 2.0 SQL数据缓存依赖 [SqlCacheDependency ] )
Asp.net 2.0 提供了一个新的数据缓存功能,就是利用sql server2005 的异步通知功能来实现缓存 1.首先在sqlserver2005 中创建一个test的数据库. 在SQL Ser ...
- SQL数据缓存依赖 [SqlServer | Cache | SqlCacheDependency ]
前言 本文主要是对<ASP.NET 2.0开发指南>——<数据缓存>章节内容的提取并略有补充. 参考资料 1. <ASP.NET 2.0开发指南> 2. ...
- SQL数据缓存依赖总结
以前只听过SQL server数据缓存依赖,但一直没使用,由于项目需要,才研究了一番,发现了一个很诡异的问题,竟然是一个操作顺序问题导致的. SQL server数据缓存依赖有两种实现模式,轮询模式, ...
- web开发人员须知的web缓存知识–将数据缓存到浏览器端Net实现
现实中,服务器在向浏览器发送的数据中,一部分数据是不经常更新的,如果能将这部分数据缓存到浏览器端,将会大大降低传输的数据,提高应用的性能.通过Expires策略,可以使用HTTP 协议定义的缓存机制将 ...
- ASP.NET缓存 Cache之数据缓存
添加 Cache[Key]=object or Cache.Insert 移除 Cache.Remove(key) 1.将值直接写入Cache 代码如下 复制代码 HttpContext.Curre ...
- 【缓存】Sql Server 2005/2008 SqlCacheDependency查询通知的使用总结
Sql server 7.0/2000下 SqlCacheDependency使用轮询的方式进行缓存失效检查, 虽然ms说对服务器压力不大, 但还是有一些的, 而且对于不常改动的混存内容无休止的轮询感 ...
- echarts图形报表缓存问题(option数据缓存)
这几天我在工作中用到了echarts开发报表.每次查询出来的数据都是新的,但是echart展现的图形报表却还是之前的数据.网上找了搜索了很多次也没能解决,后面加了技术群才解决的. 我开始已经确定是报表 ...
- Yii的缓存机制之数据缓存
具体说法就是可以缓存变量信息. 设置:Yii::app()->cache->set(名字, 值, 过期时间): 使用:Yii::app()->cache->get(名字); 删 ...
- SQL server数据缓存依赖
SQL server数据缓存依赖有两种实现模式,轮询模式,通知模式. 1 轮询模式实现步骤 此模式需要SQL SERVER 7.0/2000/2005版本以上版本都支持 主要包含以下几 ...
随机推荐
- CSS2.1SPEC:视觉格式化模型之width属性详解(上)
在介绍了包含块之后,CSS2.1标准中介绍了width属性和height属性,这两个属性在我们的页面布局中也发挥着重要的作用.在盒模型中,width和height包围了一个框的内容区域(content ...
- __setattr__,__getattr__
class A(object): def __setattr__(self, key, value): self.__dict__[key] = value def __getattr__(self, ...
- 程序媛计划——python正则表达式
#定义 正则表达式是对字符串操作的一种逻辑公式,通过它我们能筛选过滤出我们需要的内容,如判断一串数字是否是电话号码. #原理 先把正则表达式的字符串转换成 Pattern 对象,接着用这个对象处理文本 ...
- 【OCP 062新题】OCP题库更新出现大量新题-9
9.You ran this command on a source database: $> expdp hr/hr DIRECTORY=dumpdir DUMPFILE=empl.dmp V ...
- FunDA(10)- 用户功能函数模式:User Function Model
前面我们提过:FunDA就像一个管道(PipeLine).管道内流动着一串数据(Data)或者运算指令(Action).管道的源头就是能产生纯数据的数据源(Source),跟着在管道的中间会有一些节点 ...
- Manjaro Linux执行某些命令缺少libtinfo.so.5问题
Manjaro默认有libtinfo.so.6而没有libtinfo.so.5,软件如果需要可执行以下命令安装: sudo pacman -S ncurses5-compat-libs #或 sudo ...
- Ubuntu软件更新时出错问题解决
apt-get instal update 提示:错误,无法解析域名等等之类的 网上解决办法一大堆,先别急着用网上的方法,来检查检查系统是否有网络连接 网络图标显示网络连接,等等,别被表面迷惑了,命令 ...
- CSS中的BFC详解
引言: 这篇文章是我对BFC的理解及总结,带你揭开BFC的面纱.你将会知道BFC是什么,形成BFC的条件,BFC的相关特性,以及他的实际应用. 一.何为BFC BFC(Block Formatting ...
- 微信小程序开发笔记1,认识小程序的项目构成
省去安装和基本操作, app.js脚本文件 qpp.json配置文件(添加删除页面,都要在这个文件下修改入口配置) app.wxss样式表文件 app前缀为全局的 在app.json中配置项目的每个页 ...
- Seqlist L 与 Seqlist *L的区别
Seqlist L结构体变量,SeqlistInsert之后不可以带回新的插入数据. Seqlist *L 是传结构体指针 用SeqlistInsert之后可以有新的插入.