数据库缓存依赖

数据库缓存依赖,在数据库中的数据更改的时候,它能自动的使缓存中的数据失效。这个特征仅在SQL 2005以及以后的版本中适用。

为了理解SQL 缓存依赖的工作原理,先了解一些过去常用的有缺陷的解决方案。

一个常用的技术是使用标记文件。使用这种技术,你在缓存里增加一个数据对象,然后建立起一个文件依赖。然而,这个文件是空文件,你只是用来做标记。
当用户调用存储过程改变表里的数据,存储过程会删除或者修改标记文件。ASP.NET会立即侦测到这个改变,然后去除符合的缓存项。这个丑陋的工作环境没有伸缩性,并且多个存储过程一起调用的时候,可能会有并发问题。这也迫使你存储过程代码混乱,因为每个存储过程要有相似的文件修改逻辑。让数据库系统和文件系统交互是一个坏主意,增加复杂度减少安全性。

另一个常用的方法是使用自定义的http handler。在这种情况下,代替交互文件,这些存储过程调用http handler并且船体query string来指示数据被改动。http handler能够使用Cache.Remove来去除数据。

使用这种方法的问题在于,它对存储过程的扩展有相当大的复杂性,而且,http handler请求必须是同步的,这就导致明显延迟。更糟的是,延迟在每次存储过程执行时出现。

因此,我们需要的是一个可以异步通知的方法,并且是可伸缩可靠的。也就是说,数据库服务器应该通知ASP.NET而不需要停止当前链接。重要的是,它应该松耦合的建立缓存依赖,存储过程不需要知道缓存这回事情。数据库服务器应该监控数据改变,通过各种方法,包括脚本,sql命令,或者批处理。即使改变不是直接由期望的存储过程引发,这个改变也要被通知到ASP.NET.最终,这个通知方法要能支持web farm。

微软把ASP.net,SQL Server, ADO.NET,IIS开发组中的架构师集中起来,一起实现一个解决方案。他们提出2种不同的架构,一种是关于SQL Server 2000 。另一种是SQL Server 2000后续版本。比如SQL Server 2005.他们都用到了SqlCacheDependency 类,该类从CacheDependency 继承。

使用SQL缓存依赖,相对于基于时间的过期策略来说还是非常复杂。如果对实时性要求不是很高,不需要使用它。

缓存通知的工作原理

SQL Server 2005将通知架构和消息系统内建在数据库中,叫做Service Broker。Service Broker管理队列,这个队列和表,存储过程或者试图有相同的地位。

使用Service Broker,你能够从特定的数据库事件中获得通知,最直接的方法是使用CREATE EVENT NOTIFICATION 命令来指示你要监控的事件。但是,.NET提供了一个更高级的模型,和ADO.net整合在一起。使用这个模型,你可以很简单的注册一个查询命令,.NET也会自动指导SQL服务器发送通知。ASP.NET在这个基础上提供一个更高级别的模型,允许你在一个查询无效的时候自动的使cache项无效。

SQL Server通知机制工作起来和索引视图类似。每次执行一个操作,SQL Server决定该操作是否影响了注册的命令,如果是,会发送一个通知消息,并且停止通知进程。

如下图所示:

启用通知

仅有的配置就是确定你设置了数据库的ENABLE_BROKER标志
Use Northwind
ALTER DATABASE Northwind SET ENABLE_BROKER

通知由Select和存储过程一起工作。然而,使用select语法时有一些限制,你必须遵守:

必须使用表的全名,[Owner].table

不能使用聚集函数,比如count(),MAX()

不能用通配符*来选择所有列。只能写成每个列名。

这些是最重要的规则,联机帮助上还有更多的警告和说明。

创建缓存依赖

当创建缓存依赖时,SQL server需要知道你用来获取数据的数据库命令。如果你使用编程的缓存,你必须创建SqlCacheDependency对象,使用构造器来接受一个SqlCommand对象。
// Create the ADO.NET objects.
string connectionString = WebConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
SqlConnection con = new SqlConnection(connectionString);
string query ="SELECT EmployeeID, FirstName, LastName, City FROM dbo.Employees";
SqlCommand cmd = new SqlCommand(query, con);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
// Fill the DataSet.
DataSet ds = new DataSet();
adapter.Fill(ds, "Employees");
// Create the dependency.
SqlCacheDependency empDependency = new SqlCacheDependency(cmd);
// Add a cache item that will be invalidated if one of its records changes
// (or a new record is added in the same range).
Cache.Insert("Employees", ds, empDependency);
你也需要调用静态方法SqlDependency.Start() 来初始化监听Web服务器的服务。这只需要对每个数据库连接执行一次,通常调用的地方是在global.asax文件中的Application_Start() 方法中。

SqlDependency.Start(connectionString);

这个方法打开一个新的,非池化的数据库连接。ASP.NET使用这个连接检查通知队列。初次调用Start(), 生成一个有着独一无二名字的新的队列会自动,新的通知服务也随即生成,然触发一个后监听开始。当通知收到,Web Services把通知放入队列,SqlDependency.OnChange事件,是缓存项无效。

即使你有在几个不同的表上有依赖,他们使用的还是相同的队列。这意味着你只需要调用SqlDependency.Start()。如果你不小心调用SqlDependency.Start()方法多次,不会有任何事发生。最后,你可以使用下面的代码分离监听。

SqlDependency.Stop(connectionString);
通常,在Application_End() 方法中分离监听,释放资源。

ASP.NET 缓存(10)相关推荐

  1. 浅谈ASP.NET 缓存技术

    缓存是指系统或应用程序将频繁使用的数据保存到内存中,当系统或应用程序再次使用时,能构快速的获取数据.它的弊端在于显示的内容可能不是最新,最精确的.ASP.Net 缓存主要分为两大类: 网页输出缓存和应 ...

  2. asp.net缓存机制

    一.缓存的类别 1.页面输出ASP.NET数据缓存 页面输出缓存是一种传统级别的相对简单的缓存机制.它将页面数据缓存在服务器内存中,当有客户端再次请求这些内容的时候,服务器可以直接将这些页面数据输出, ...

  3. [转]ASP.Net缓存总结

    ASP.Net缓存总结 Asp.net 缓存技术总结 2008-04-01 17:29 提高性能最好最快的办法当然是通过缓存来改善,对于任何一个web开发者都应该善用缓存.Asp.net下的缓存机制十 ...

  4. ASP.Net缓存 1

    提高性能最好最快的办法当然是通过缓存来改善,对于任何一个web开发者都应该善用缓存.Asp.net下的缓存机制十分强大,用好缓存机制可以让我们极大的改善web应用的性能. 提高性能最好最快的办法当然是 ...

  5. ASP+页缓存OutputCache Duration用法

    声明的方式控制   ASP.NET   页或页中包含的用户控件的输出缓存策略.有关输出缓存的更多信息,请参见   ASP.NET   缓存功能.         <%@   OutputCach ...

  6. ASP.Net缓存总结

    提高性能最好最快的办法当然是通过缓存来改善,对于任何一个web开发者都应该善用缓存.Asp.net下的缓存机制十分强大,用好缓存机制可以让我们极大的改善web应用的性能,下面是一些总结的缓存的知识点, ...

  7. ASP.NET缓存 Cache

    ASP.NET缓存 Cache 缓存介绍 如果每次进入页面的时候都查询数据库生成页面内容的话,如果访问量非常大,则网站性能会非常差, 而如果只有第一次访问的时候才查询数据库生成页面内容,以后都直接输出 ...

  8. ASP.NET缓存中Cache过期的三种策略

    ASP.NET缓存中Cache过期的三种策略 原文:ASP.NET缓存中Cache过期的三种策略 我们在页面上添加三个按钮并双击按钮创建事件处理方法,三个按钮使用不同的过期策略添加ASP.NET缓存. ...

  9. ASP.NET 缓存技术(一)——启用页面输出缓存

    作者寄语:MSDN 是最好的老师,互联网是最智慧的生命体,分享是最重要的成长途径,技术的进步在于学习.实践和创新! 本系列所讲述的技术和展示的代码适用于 .NET Framework 4.0 和 II ...

  10. 返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 Web API

    返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 Web API 原文:返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 ...

最新文章

  1. Java课程主观题作业_JAVA课程作业01
  2. linux版本更新,滚动更新与固定版本Linux之争
  3. httpclient解析https网页
  4. UA PHYS515A 电磁理论III 静磁学问题1 Maxwell方程与静磁学问题
  5. python大乐透2019143_[新浪彩票]老梁大乐透第19143期:前区大号走强
  6. boost::allocator_destroy的实例
  7. 最常见的208道Java最新面试题及答案(一)
  8. 139.00.007 Git学习-Cheat Sheet
  9. Process Explorer工具介绍
  10. jQuery源码分析 整体框架部分及部分常用方法
  11. BZOJ 1025: [SCOI2009]游戏
  12. prim算法适用条件_内部排序算法的比较及应用
  13. ANDROID 获得地理位置
  14. 神经网络基础模型--Logistic Regression的理论和实践
  15. cmd命令查询硬盘序列号,磁盘ID,MAC地址
  16. mt管理器主题修改教程_QQ主题+微博主题
  17. 谁是元宇宙的基础设施?数据中心助推元宇宙发展
  18. 贫富差距,不是收入分化,而是资产分化
  19. (转载)0x0F1AFD76 (libcocos2d.dll) (Plane.exe 中)处有未经处理的异常: 0xC0000005: 读取位置 0x00000018 时发生访问冲突。
  20. python3 爬虫 爬取华为应用市场 APP应用评论(一)爬取全部评论——作业帮

热门文章

  1. python编写程序判断数据类型_python中如何判断一个变量的数据类型
  2. CS224N笔记——Word Window分类与神经网络
  3. JavaScript实现动态添加、移除元素或属性的方法分析
  4. jquery-1.10.2_d88366fd.js和jquery-3.1.0.min.js 在用touch事件时候, event.changedTouches[0]报错的问题。...
  5. Python学习之路28-符合Python风格的对象
  6. 物联网未来已来,新零售已处在巨变前夕
  7. 虚拟机上网设置教程之如何用虚拟机上网
  8. dev gridcontrol 单选框效果
  9. Android开机动画过程
  10. 价格穿越,跟 普通的大于 小于是有差别的