开发者社区> 技术小甜> 正文

ASP.NET 缓存(10)

简介:
+关注继续查看

数据库缓存依赖

数据库缓存依赖,在数据库中的数据更改的时候,它能自动的使缓存中的数据失效。这个特征仅在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决定该操作是否影响了注册的命令,如果是,会发送一个通知消息,并且停止通知进程。

如下图所示:

image

启用通知

仅有的配置就是确定你设置了数据库的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() 方法中分离监听,释放资源。



















本文转自cnn23711151CTO博客,原文链接:http://blog.51cto.com/cnn237111/589395 ,如需转载请自行联系原作者


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
13862 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
18985 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
25226 0
ASP.NET 缓存 Cache
ASP.NET 提供一个功能完整的缓存引擎,页面可使用该引擎通过 HTTP 请求存储和检索任意对象.缓存的生存期与应用程序的生存期相同,也就是说,当应用程序重新启动时,将重新创建缓存。 将数据添加到缓存中 1。
847 0
Asp.Net中使用Couchbase——Memcached缓存入门篇
本文个人同步博客地址: http://aehyok.com/Blog/Detail/96.html   个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok 本文文章链接:http://www.cnblogs.com/aehyok/p/3946286.html 感谢您的阅读,如果您对我的博客所讲述的内容有兴趣,那不妨点个推荐吧,谢谢支持:-O。
566 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
14741 0
解决ASP.NET中缓存被覆盖的问题
众所周知, ASP.NET的System.Web命名空间下的缓存可以用来保存一段时间的数据 因此, 在项目中我们可能利用它来保存一些缓存数据. 因此, 很多人写了这样的工具类来保存和加载缓存   保存缓存:   public static void SetCache(string Cac...
652 0
+关注
10145
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载