使用 SQL 缓存依赖项,数据库缓存依赖 (附实例)

使用 SQL 缓存依赖项

最简单的缓存策略就是使缓存数据在一个指定的时间周期后过期。但是这个简单的方法意味着缓存数据没有保持与底层数据源的联系,从而导致过期数据长时保存或当前数据很快过期。更好的方法是使用
SqlCacheDependency 类,这样数据一直被缓存,直到其底层数据在 SQL 数据库中被修改。本篇教程将讲解怎样使用这个类。

Part 1

简介

使用 ObjectDataSource 缓存数据 和在架构中缓存数据 教程中探讨的缓存技术使用基于时间的有效期 , 在指定的周期过后从缓存中清除数据。该方法是平衡缓存性能与数据过时的最简单的方法。选择 x 秒的有效期,页面开发者虽然只能享受到 x 秒的缓存带来的好处,但可高枕无忧,因为数据的过期时间最多不会超过 x 秒。当然,对于静态数据, x 可以延长为
web 应用程序的生命周期,如 应用程序启动时缓存数据 教程所述。

缓存数据库数据时,人们常常会选用基于时间的有效期,因为其易于使用。但常常这不是个合适的方案。理想情况是:数据库数据一直被缓存,直到底层数据在数据库中被修改;此时才清除缓存。该方法能最大地获得缓存带来的性能上的好处,同时使过时数据保持的时间最短。然而,为享受到这些好处,必须建立一套系统,该系统可以感知到底层数据库数据发生了改变并从缓存中清除相应的条目。在 ASP.NET 2.0 以前,页面开发者负责实现该系统。

ASP.NET 2.0 提供了 SqlCacheDependency
 以及必要的基础架构 , 利用它们可以在数据库发生了变化时感知到变化 , 从而清除相应的缓存条目。有两种技术可用于感知底层数据发生的变化:通知和轮询。下面我们会讨论通知和轮询的不同之处,之后,我们将创建必要的基础架构来支持轮询,然后探讨怎样通过声明和编程两种方式来使用 SqlCacheDependency 类。

了解通知和轮询

有两种技术可用于感知数据库中的数据发生的变化:通知和轮询。使用通知时,对于某个具体查询,如果自其上次执行以来其查询结果已发生了改变,数据库会自动通知 ASP.NET 运行时。使用轮询时,数据库服务器保存特定表最近发生更改时的信息。 ASP.NET 运行时周期性地查询数据库,看哪些表的数据在缓存后发生过改动。其数据改动过的那些表的相关缓存条目会被清除。

选用通知技术时,需要的建立工作比轮询少,并且具有更细的粒度,因为该技术在查询级而不是在表级跟踪变化。遗憾的是,只有在 Microsoft SQL Server 2005 的完整版,即非速成 (non-Express) 版中,才能使用通知。而对于 Microsoft SQL Server 从 7.0 到 2005 之间的所有版本 , 都可采用轮询技术。由于这些教程使用的是 SQL Server 2005 Express 版,我们将集中探讨建立和使用轮询。有关 SQL Server 2005 的通知功能的更多资料,请参考本教程末尾的更多阅读材料部分。

采用轮询时 , 需配置数据库 , 使其包含一个名为 AspNet_SqlCacheTablesForChangeNotification 的表 , 该表有三列– tableName 、notificationCreated 和changeId 。对于那些在 web 应用程序的 SQL 缓存依赖项中可能需要用到其数据的表,该表都有一条记录与之对应。 tableName 列指定表名,而 notificationCreated 指示将该记录添加到表中时的日期和时间。changeId 列为 int 类型 , 其初始值为0
。每次修改对应的表时 , 其值递增。

除了 AspNet_SqlCacheTablesForChangeNotification 表之外,数据库还需要对可能出现在 SQL 缓存依赖项中的每个表包含一个触发器。每当在 AspNet_SqlCacheTablesForChangeNotification 表中插入、更新、删除一条记录,或表中 changeId 值递增时,会执行这些触发器。

在使用一个SqlCacheDependency 对象缓存数据时 ,ASP.NET 运行时会跟踪相应表的当前 changeId 。系统周期性地检查数据库,一旦发现某个 SqlCacheDependency 对象的 changeId 值不同于数据库中的相应值,就清除该对象,因为 changeId 值不同意味着数据被缓存后相应表又有了变化。

参考资料(附实例):

使用工具:

aspnet_regsql.exe

工具地址:C:\Windows\Microsoft.NET\Framework\v2.0.50727

先在命令地工具中通过命令:cmd进入到aspnet_regsql.exe所在目录:cd C:\Windows\Microsoft.NET\Framework\v2.0.50727

远程服务器:128.45.4.34

数据库名:RMA_DWH

缓存依赖的两个表名:RMA_R_ARTICLE_LOCAL_ATTR、RMA_R_PURCHACE_ATTR

aspnet_regsql.exe -S 128.45.4.34 -U sa -P 23WSXCDE#@ -d RMA_DWH -ed

aspnet_regsql.exe -S 128.45.4.34 -U sa -P 23WSXCDE#@ -d RMA_DWH -t RMA_R_ARTICLE_LOCAL_ATTR -et

aspnet_regsql.exe -S 128.45.4.34 -U sa -P 23WSXCDE#@ -d RMA_DWH -t RMA_R_PURCHACE_ATTR -et

上面的脚本执行之后,再在代码中配置web.config文件,如下:

1:数据库的连接字符串

<connectionStrings>

<add name="ConnectionString" connectionString="Data Source=128.45.4.34;Initial Catalog=RMA_DWH;Persist Security Info=True;User ID=sa;Password=23WSXCDE#@;Max Pool Size = 51200;" providerName="System.Data.SqlClient"/>

</connectionStrings>

2: 缓存的配置项:

<caching>

<sqlCacheDependency enabled="true" pollTime="1000" >

<databases>

<add name="RMA_DWH" connectionStringName="ConnectionString" />

</databases>

</sqlCacheDependency>

</caching>

3:asp.net代码的使用:

protected void Page_Load(object sender, EventArgs e)
        {
            string TS;
            DateTime time = DateTime.Now;
            bool b = false;
            DataTable DT = new DataTable();
            <span style="color:#ff0000;">DataTable DT_Article =(DataTable)Cache["ARTICLE"];</span>
            if (DT_Article != null)
                DT = DT_Article;
            else
            {
                Common.SqlBase SB = new Common.SqlBase();
                DT = SB.Query_Table("SELECT TOP 1000  * FROM dbo.RMA_V_ARTICLE");
                <span style="color:#ff6666;">SqlCacheDependency productsTableDependency = new SqlCacheDependency("RMA_DWH", "RMA_R_ARTICLE_LOCAL_ATTR");
                Cache.Insert("ARTICLE", DT, productsTableDependency, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration);</span>
                b = true;
            }
            TS = (DateTime.Now - time).TotalSeconds.ToString();
            if (!b)//使用缓存
            {
                labState.Text = "使用缓存 " + TS + " s    " + DateTime.Now;
            }else
            {
                labState.Text = "未使用缓存 " + TS + " s    " + DateTime.Now;
            }
            ProductsDeclarative.DataSource = DT;
            ProductsDeclarative.DataBind();

        }

ASP.NET的缓存依赖机制-SQL缓存依赖篇

http://blog.itpub.net/12639172/viewspace-618184/

使用 SQL 缓存依赖项

http://msdn.microsoft.com/zh-cn/dd263032

http://msdn.microsoft.com/zh-cn/dd263037

aspnet_regsql.exe -S server -U user -P password -d database -ed

aspnet_regsql.exe -S 128.45.4.34 -U sa -P 23WSXCDE#@ -d RMA_DWH -ed

aspnet_regsql.exe -S <i>server</i> -U <i>user</i> -P <i>password</i> -d <i>database</i> -t <i>tableName</i> -et

aspnet_regsql.exe -S 128.45.4.34 -U sa -P 23WSXCDE#@ -d RMA_DWH -t RMA_R_ARTICLE_LOCAL_ATTR -et

aspnet_regsql.exe -S 128.45.4.34 -U sa -P 23WSXCDE#@ -d RMA_DWH -t RMA_R_PURCHACE_ATTR -et

SqlDependency和SqlCacheDependency缓存的用法及具体步骤

http://www.webkaka.com/tutorial/asp.net/2012/111912/

如何在ASP.NET调用Global.asax文件

http://www.veryhuo.com/a/view/9402.html

时间: 2024-10-10 22:24:12

使用 SQL 缓存依赖项,数据库缓存依赖 (附实例)的相关文章

c# 数据库缓存依赖

1.为缓存依赖项启动通知数据库 在vs开发人员命令提示中运行(切换到aspnet_regsql.exe所在目录,示例目录:C:\Windows\Microsoft.NET\Framework64\v4.0.30319):    aspnet_regsql -S .  -U sa -P pwd -ed -d xxx  -et -t xxx; 缓存依赖禁用: aspnet_regsql -S . \ds -E -dd -d XXX -S服务器名称 -E集成身份验证 -U 账号 -P 密码  -ed为

模块化InnoSetup依赖项安装

原文在这里:http://www.codeproject.com/Articles/20868/NET-Framework-Installer-for-InnoSetup 源文件地址:http://www.codeproject.com/KB/install/dotnetfx_innosetup_instal/innodependencyinstaller.zip 源文件需要注册登录CodeProject才能下载 说明: 通过添加模块化innosetup脚本来自动下载和安装各种依赖项 如.NET

微擎数据库缓存的增、删、改和查函数详解

函数所在文件:framework/function/cache.mysql.func.php 目前微擎的个人真实调用: $setting = $this->module['config']; $aaaaa = $setting['copyright']; 在微擎微信公众号系统里面可以分为三类缓存:保存到数据库表core_cache中的数据库缓存.保存到文件的文件缓存和memcahe缓存,本教程介绍的是数据库缓存,也是微擎系统配置的默认缓存. 因为,处理数据库缓存的函数相对简单,所以,phpos微

更新nuget 出现 循环依赖项

错误页: 在使用nuget 管理引用时候,更新出现 上面的情况. 这个问题,是更新的时候出现的.然后就查了查  什么是 循环依赖项. 循环依赖项目: 说的简单点就是,A引用了B,B又企图去引用A. 当然谁都不会 这样去做的.但是引用关系的时候是会传递的. 所以可能造成,B引用了A,C引用了B.然后不自主的C又引用A.此时就会出现  循环依赖. 看上图,更新出现 循环依赖. 举个例子: 如图,该包 依赖于  knockoutjs包. 如果,你的项目中,已经引用了knockoutjs包之后,再去引用

什么是依赖项属性?(在练习使用StoryBoard故事板时,遇到的问题)

概述: Windows Presentation Foundation (WPF) 提供了一组服务,这些服务可用于扩展公共语言运行时 (CLR) 属性的功能.这些服务通常统称为 WPF 属性系统.由 WPF 属性系统支持的属性称为依赖项属性. 依赖项属性提供用来扩展属性功能的功能, 最常用的莫过于"数据绑定"功能,依赖项属性可以通过数据绑定来引用值.数据绑定通过特定的标记扩展语法(在 XAML 中)或 Binding 对象(在代码中)来工作.使用数据绑定,最终属性值的确定将延迟到运行时

WPF 依赖项属性

WPF中的依赖项属性 “依赖项属性的用途在于提供一种方法来基于其他输入的值计算属性值”,只有定义属性为依赖项属性,这个属性才支持样式设置,数据绑定,继承,动画和默认值. 属性对应的字段必需是公有,静态,只读的,类型为DependencyProperty.即public static readonly DependencyProperty 字段名,同时字段的命名也有规范,属性名+Property,字段在定义时,通过DependencyProperty.Register来实注册属性(只有注册了,才能

开启SQLSERVER数据库缓存依赖优化网站性能

很多时候,我们服务器的性能瓶颈会是在查询数据库的时候,所以对数据库的缓存非常重要,那么有没有一种方法,可以实现SQL SERVER数据库的缓存,当数据表没有更新时,就从缓存中读取,当有更新的时候,才从数据表中读取呢,答案是肯定的,这样的话我们对一些常用的基础数据表就可以缓存起来,比如做新闻系统的新闻类别等,每次就不需要从数据库中读取了,加快网站的访问速度. 那么如何开启SQLSERVER数据库缓存依赖,方法如下: 第一步:修改Web.Config的<system.web>节的配置,代码如下,让

.NET 数据库缓存依赖策略实现

处理大型门户网站 一般都需要 使用缓存技术这个web加速器在 PHP 和 java 一般 使用的是 基于squid 来做. 当然在 windows .NET 平台也是可以的 squid有 windows版本.这个以后再去研究,现在 就介绍一下 .NET 自带的 缓存策略.Microsoft的petshop就用到了它; 一.基于数据库触发(设置缓存依赖策略,当数据库中数据发生变化时,触发缓存失效;但微软提供的解决方案目前仅支持SQL Server,如果是ORACLE需要自己实现触发接口). 二.基

Asp.net数据库缓存依赖

Asp.net数据库缓存依赖 更多的时候,我们的服务器性能损耗还是在查询数据库的时候,所以对数据库的缓存还是显得特别重要,上面几种方式都可以实现部分数据缓存功能.但问题是我们的数据有时候是在变化的,这样用户可能在缓存期间查询的数据就是老的数据,从而导致数据的不一致.那有没有办法做到,数据如果不变化,用户就一直从缓存中取数据,一旦数据变化,系统能自动更新缓存中的数据,从而让用户得到更好的用户体验. 答案是肯定的!.NET已经为我们提供了这样一种非常好的解决方法:SqlCacheDependency