Asp.net 2.0 提供了一个新的数据缓存功能,就是利用sql server2005 的异步通知功能来实现缓存

1.首先在sqlserver2005 中创建一个test的数据库.

在SQL Server 2005上执行

ALTER DATABASE <DatabaseName> SET ENABLE_BROKER;语句让相应的数据库启用监听服务,以便支持SqlDependency特性。

添加一个 employee的数据库表.

1CREATETABLE[dbo].[employee](
2[id][int]IDENTITY(1,1)NOTNULL,
3[name][varchar](50)
4)
5

2使用 vs2005 创建一个新的asp.net项目.

web.config如下

1<?xmlversion="1.0"?>
2<configurationxmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
3<appSettings/>
4<connectionStrings>
5<addname="mySource"connectionString="DataSource=.\sql2005;InitialCatalog=test;PersistSecurityInfo=True;UserID=sa;Password=sasa"providerName="System.Data.SqlClient"></add>
6</connectionStrings>
7<system.web>
8<compilationdebug="true"/>
9<authenticationmode="Windows"/>
10</system.web>
11</configuration>
12

3.编写global.asax文件,启动监听sql2005通知事件.

<%@ApplicationLanguage="C#"%>
<%@ImportNamespace="System.Data.SqlClient"%>

<scriptrunat="server">

voidApplication_Start(objectsender,EventArgse)
{
stringconnStr=ConfigurationManager.ConnectionStrings["mySource"].ConnectionString;
SqlDependency.Start(connStr);
}

voidApplication_End(objectsender,EventArgse)
{
stringconnStr=ConfigurationManager.ConnectionStrings["mySource"].ConnectionString;
SqlDependency.Stop(connStr);
}
</script>

4.编写数据访问代码.创建一个EmployeeData的类,代码如下

usingSystem;
usingSystem.Data;
usingSystem.Data.SqlClient;
usingSystem.Configuration;
usingSystem.Data.Common;
usingSystem.Web;
usingSystem.Web.Caching;
usingSystem.Web.Security;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.WebControls.WebParts;
usingSystem.Web.UI.HtmlControls;

///<summary>
///EmployeeData的摘要说明
///</summary>
publicclassEmployeeData
{
publicEmployeeData()
{
}

privateHttpContextcontext;

publicDataSetGetCacheData()
{
context=HttpContext.Current;
DataSetcache=(DataSet)context.Cache["employee"];
if(cache==null)
{
returnGetData();
}
else
{
returncache;
}
}


publicDataSetGetData()
{
stringconnStr=ConfigurationManager.ConnectionStrings["mySource"].ConnectionString;
SqlConnectionconn=newSqlConnection(connStr);
SqlDataAdapteradp=newSqlDataAdapter("selectid,namefromdbo.employee",conn);
SqlCacheDependencydep=newSqlCacheDependency(adp.SelectCommand);
DataSetds=newDataSet();
adp.Fill(ds);
context.Cache.Add("employee",ds,dep,Cache.NoAbsoluteExpiration,Cache.NoSlidingExpiration,CacheItemPriority.Default,newCacheItemRemovedCallback(this.DataDiff));
returnds;
}

publicvoidDataDiff(stringkey,objectvalue,CacheItemRemovedReasonreason)
{
Console.WriteLine("key:"+key);
GetData();
}

}

这里需要注意的是 select语句的写法, 不能使用 select * 的方式,一定要在表名前加架构名称 如我们这里的 dbo.employee.

5.编写测试页面代码.

<%@PageLanguage="C#"AutoEventWireup="true"CodeFile="Default.aspx.cs"Inherits="_Default"%>

<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<htmlxmlns="http://www.w3.org/1999/xhtml">
<headrunat="server">
<title>无标题页</title>
</head>
<body>
<formid="form1"runat="server">
<div>
<asp:GridViewID="GridView1"runat="server">
</asp:GridView>
</div>
</form>
</body>
</html>

6.插入后台代码

usingSystem;
usingSystem.Data;
usingSystem.Configuration;
usingSystem.Web.Caching;
usingSystem.Data.SqlClient;
usingSystem.Web;
usingSystem.Web.Security;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.WebControls.WebParts;
usingSystem.Web.UI.HtmlControls;

publicpartialclass_Default:System.Web.UI.Page
{
protectedvoidPage_Load(objectsender,EventArgse)
{
EmployeeDataem=newEmployeeData();
GridView1.DataSource=em.GetCacheData();
GridView1.DataBind();
}

转自:http://www.cnblogs.com/wzyexf/archive/2008/12/26/1363195.html

SQL数据缓存依赖 [SqlServer | Cache | SqlCacheDependency ]

前言

本文主要是对《ASP.NET 2.0开发指南》——<数据缓存>章节内容的提取并略有补充。

参考资料

1.《ASP.NET 2.0开发指南》

2..NET 2.0 SqlDependency快速上手指南

支持数据库

SQL SERVER 7.0/2000/2005版本

正文

一、SQL SERVER 7.0/2000和SQL SERVER 2005的简介及比较

1.1SQL SERVER 7.0/2000

SQL SERVER 7.0/2000没有提供内置的支持数据缓存依赖的功能,所以只能通过采用添加特定数据库表、触发器等方式,通过后台不断轮询数据库来检查数据更改。当在数据表上执行INSERT、UPDATE、DELETE操作时将自动发出更改通知,所以只能监测到表级,具体到哪一行是没法跟踪的。

使用方法步骤:

1.1.1使用aspnet_regsql命令行或SqlCacheDependencyAdmin来配置连接数据库。

1.1.1.1ALTER DATABASE <DatabaseName> SET ENABLE_BROKER;

aspnet_regsql -S <server> -Usa -P sa -d <database>-ed启动数据库的数据缓存依赖功能

aspnet_regsql -S <server> -Usa -P sa -d <database> -t <table>-et启动数据表的数据缓存依赖功能

1.1.1.2

SqlCacheDependencyAdmin.EnableNotifications(connectionString);//启动数据库的数据缓存依赖功能

SqlCacheDependencyAdmin.EnableTableForNotifications(connectionString, table);//启用数据表缓存

推荐这段代码写在Global.asax的Application_Start方法中,以便应用程序启动的时候就启用数据库和数据表的缓存依赖功能。

1.1.2配置Web.config

<sqlCacheDependency enabled="true" pollTime="10000">配置在<sytem.web>下的<caching>结点下,只有一个数据库的话不必指定下一级<database>结点

1.1.3应用程序数据缓存中使用(还可以在数据源控件、输出缓存整个页面时使用,这里就不介绍了,下同)

SqlCacheDependency scd = new SqlCacheDependency("数据库名称","表名");

Cache.Insert(...,scd,...);

1.2SQL SERVER 2005

内置支持SQL数据缓存依赖,内置通知传递服务,能够提供更小粒度的数据更改监测,使用和配置简单。

使用方法步骤:

1.2.1检测是否已经启用Service Broker

Select DATABASEpRoPERTYEX('数据库名称','IsBrokerEnabled')-- 1 表示已经启用 0 表示没有启用

这个地方我看有些朋友翻译的成“是否能启用”,这是不对的,这里我把英文原文帖出来:“This can be checked by calling "Select databasepropertyex('db Name', 'IsBrokerEnabled')". A '1' means that the broker is enabled. A '0' means that the broker is not enabled.”。

依据我的经验,如果直接在当前SqlServer2005上新建一个数据库的话,默认是打开的,如果是从其他地方数据库导过来的,导入之后默认关闭了。(可能有不准确,大家可以自己试验一下测试一下)。如果已经打开可直接调到1.2.2。

1.2.1.1启用Service Broker

ALTER DATABASE数据库名称 SET ENABLE_BROKER;

1.2.2在实现基于服务的SQL数据缓存依赖过程中,需要显式调用SqlDependency.Start来启动接受依赖项更改通知的侦听器。

SqlDependency.Start(connectionString);//推荐将这段代码加到Global.asax的Application_Start方法中,

SqlDependency.Stop(connectionString);//用于关闭,可加在Global.asax的Application_End方法中。

1.2.3应用程序数据缓存中使用

SqlCommand cmd = new SqlCommand(sql,conn);

SqlCacheDependency scd = new SqlCacheDependency(cmd);

Cache.Insert(...,scd,...);

注意:

a).必须设置完全限定名称的数据表。即表名前面需要加所有者,如dbo.test。

b).必须明确设置所访问数据库列名称,不能使用“*”。

c).必须保证不是聚合函数。如COUNT、MAX等。

1.3比较、区别

 
 

SQL SERVER 7.0/2000

SQL SERVER 2005

实现机制

轮询

通知传递服务(Service Broker)

是否需要配置启用

需要

不需要,内置支持

数据更改检测

限于表级更改监测

表级、行级更改监测

并且很明显,SQL SERVER 2005的缓存机制更加高效。另外,SqlCacheDependency类还特别结合SQL SERVER 2005 进行了优化:

a).使用SQL SERVER 2005 时,SqlCacheDependency类支持与System.Data.SqlClient.SqlDependency类进行集成。应用程序可创建SqlDependency对象,并通过OnChanged事件处理程序接受通知进行注册。这样,应用程序不仅可以使用Sql server 2005的查询通知机制来监测使用SQL查询结果无效的数据更改,并将缓存对象从缓存中移除,而且还可以轻松获取数据更改通知,以便刷新缓存。(从这里可以看出,当触发onRemoveCallback委托的时候,数据已经从缓存里面删除了,这样一来可以手动在委托里面添加缓存,或者干脆设置成null,让他下次调用的时候再缓存。)

b).不仅向应用程序添加缓存依赖项,还可以与@OutputCache指令一起使用,以生成依赖于SqlServer数据库表的输出缓存的页面或用户控件。对于用户控件,@OutputCache指令不支持使用SQL SERVER 2005的查询通知(即onRemoveCallback委托)。

二、System.Web.Caching.Cache Insert和Add区别

2.1Add方法

object Add(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback);

2.2Insert方法

void Insert(string key, object value);

void Insert(string key, object value, CacheDependency dependencies);

void Insert(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration);

void Insert(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemUpdateCallback onUpdateCallback);

void Insert(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback);

2.3比较、区别

a).Insert方法支持5种重载,使用灵活,而Add方法必须提供7个参数;

b).Add方法可以返回缓存项的数据对象,Insert 返回Void;

c).添加重复缓存情况下,Insert会替换该项,而Add方法会报错。

三、CacheDependency、AggregateCacheDependency、SqlCacheDependency

3.1CacheDependency是AggregateCacheDependency和SqlCacheDependency的父类。主要用于在应用程序数据缓存对象与文件、缓存键、文件或缓存键的数组或另外一个CacheDependency对象之间建立依赖关系。CacheDependency监视依赖关系比便在任何对象更改时自动移除缓存对象。CacheDependency可以监测一组(到文件或目录的)文件路径的更改情况。

3.2AggregateCacheDependency主要用于实现聚合缓存依赖。如一笔数据同时对两个表进行缓存依赖,一旦其中任何一个表数据更改缓存将失效。

3.3SqlCacheDependency将应用程序数据缓存对象、页面输出缓存、数据源控件等与指定SQL Server数据库表或Sql Server 2005 查询结果之间建立缓存依赖关系,在表发生更改(Sql Server 2005行级别更改)时,自动从缓存中删除和重新添加与该表关联的缓存对象。一般而言:

SqlCacheDependency (SqlCommand)用于SQL SERVER 2005

SqlCacheDependency (数据库名, 表名)用于SQL SERVER 7.0/2000

结束

恼于搜来搜去就那么几篇文章,全是转载,迫切需要要深入的了解缓存方面的知识,猛想起自己花10块买的正版<<ASP.NET 2.0开发指南>>还没有仔细读过,果然是本好书!写得极其详细,这里就整理提取一下然后贴上来以防止经常背着这本818页的书到处跑。欢迎指正: )

转自:http://www.cnblogs.com/over140/archive/2009/01/15/1376318.html

错误:无法启用数据库中的 Service Broker

解决方案:

Service Broker 标识符在同一网络上的所有实例中应是唯一的。否则,消息可能被误传。
那么怎么能让数据库也能使用Service Broker呢?

ALTER DATABASE TpriUserManage SET NEW_BROKER
ALTER DATABASE TpriUserManage SET ENABLE_BROKER

cache应用(asp.net 2.0 SQL数据缓存依赖 [SqlCacheDependency ] )的更多相关文章

  1. 我用ASP.NET缓存之SQL数据缓存依赖(SqlCacheDependency)

    [名词解释] 缓存(Cache)依赖,大白话解释就是缓存是否更新依赖于其它Object.那么SqlCacheDependency指的就是Cache的数据更新依赖于SQL Server数据库表的变化(  ...

  2. SQL数据缓存依赖 [SqlServer | Cache | SqlCacheDependency ]

    前言 本文主要是对<ASP.NET 2.0开发指南>——<数据缓存>章节内容的提取并略有补充. 参考资料 1.     <ASP.NET 2.0开发指南> 2.   ...

  3. SQL数据缓存依赖总结

    以前只听过SQL server数据缓存依赖,但一直没使用,由于项目需要,才研究了一番,发现了一个很诡异的问题,竟然是一个操作顺序问题导致的. SQL server数据缓存依赖有两种实现模式,轮询模式, ...

  4. SQL server数据缓存依赖

    SQL server数据缓存依赖有两种实现模式,轮询模式,通知模式. 1  轮询模式实现步骤 此模式需要SQL SERVER 7.0/2000/2005版本以上版本都支持        主要包含以下几 ...

  5. SQL SERVER 2000 & SQL SERVER 2005 数据缓存依赖

    一.SQL SERVER 7.0/2000和SQL SERVER 2005的简介及比较 1.1     SQL SERVER 7.0/2000 SQL SERVER 7.0/2000没有提供内置的支持 ...

  6. asp.net mvc5中使用缓存依赖SqlCacheDependency

    缓存是用来提高应用性能,降低服务器压力.适用于数据不易变,数据易通用的情景, 对于动态查询数据,例如数据分析,最好放弃使用缓存.使用缓存最麻烦的就是保持源数据和缓存的中的数据一致. 缓存(Cache) ...

  7. yii2.0中数据缓存之增删改查

    public function actionSss(){ /* * 获取到缓存 * 这里是获取的是根目录下 的common/main.php中的缓存类组件 * */ $cache=\Yii::$app ...

  8. 解决EF 4.0 中数据缓存机制

    EF4.0默认开启缓存机制,如果想要禁用缓存机制的话,则须加上一句话:_db.CreateObjectSet().MergeOption = MergeOption.OverwriteChanges; ...

  9. C#中缓存的简单方法及使用Sql设置缓存依赖项

    概述 使用Cache高速缓存可以提高数据的读取速度,减少服务器与客户端之间的数据交互.因为Cache一经创建就会占用服务器上的资源,所以Cache并不是越多越好,一般用于数据较固定,使用较频繁的地方. ...

随机推荐

  1. FireFox Prevent this page from creating addtional dialogs 火狐浏览器 设置 阻止此页面创建更多对话框

    FireFox英文版本老弹出“Prevent this page from creating addtional dialogs”的确认框 FireFox english version alert ...

  2. 4.python中的用户交互

    学习完如何写'hello world'之后,我们还是不太满意,因为这样代码就写死了,以后运行的时候都只打印一局固定的话而已. 但是,我想在程序运行后,自己手动输入内容怎么办,此时就要学习如何使用用户交 ...

  3. html/css 盒子布局 Margin 、Padding 、border 以及 清除浮动的知识 (学习HTML过程中的小记录)

    html/css  盒子布局 Margin .Padding .border 以及 清除浮动的知识 (学习HTML过程中的小记录) 作者:王可利(Star·星星) width     是"宽 ...

  4. 通过store为toolbar添加按钮

    目的是实现导航条toolbar可以动态加载按钮. ExtJS的版本是4.0. 实现方案有两个.方案一:添加render事件监听,在监听事件处理函数中使用Ext.Ajax获取按钮信息,实现动态添加按钮. ...

  5. Centos 安装 p7zip,即Linux下的7z

    Centos 无法直接通过yum安装7z,我们一般通过repoforge,rpmforge的软件包进行安装,你只需要下载一个对应的包,直接安装就可以 p7zip-9.20.1-1.el4.rf.i38 ...

  6. Pintos修改优先级捐赠、嵌套捐赠、锁的获得与释放、信号量及PV操作

    Pintos修改优先级捐赠.嵌套捐赠.锁的获得与释放.信号量及PV操作 原有的优先级更改的情况下面没有考虑到捐赠的情况,仅仅只是改变更改了当前线程的优先级,更别说恢复原本优先级了,所以不能通过任何有关 ...

  7. 通过修改注册表来破解sqlyog

    Sqlyog作为一款可视化的数据库管理工具,各种方便我就不说了,但是未经汉化或者绿色过的软件存在30天的生命期,到期后我们就不可以使用了,要摸卸载重装,我们还可以去修改注册表,来延长它的生命期,具体步 ...

  8. [SSH服务]——一些安全性配置和补充实验

    SSH 安全性和配置 转载于 http://www.ibm.com/developerworks/cn/aix/library/au-sshsecurity/ 对于一些之前列举的代码示例,许多系统管理 ...

  9. Windows python 安装 nNumpy、Scipy、matplotlib模块

    折腾了 很久,总结一些. 首先如果python 是64位,安装32位的numpy ,Scipy,或者matplotlib 模块. 会出现很多问题. 比如当你 在python 导入 Numpy 时,导入 ...

  10. 20145105 《Java程序设计》第2周学习总结

    20145105 <Java程序设计>第2周学习总结 教材学习内容总结 第三章主要的学习内容与c语言有很多相似的地方,讲述了Java的基本语法.其中涵盖: 1. 类型: - short整数 ...