Cach 和 AggregateCacheDependency 的使用

 引用: 

   .net2.0引入了缓存机制,提供了System.Web.Caching类 和 AggregateCacheDependency 来对数据表数据缓存操做,不过最好是Sqlserver2005 ,如果是sqlserver2000的话要对数据库进行一些命令操作

在访问量大,但更新较少的网站中使用缓存,可以大大提高运行效率;加上.NET 2.0提供的缓存依赖机制,我们可以很方便的对缓存进行管理更新;以下是本人学习的一点心得体会,希望能够起到抛砖引玉的作用。 

建立缓存依赖: 

/** <summary> 

/// 建立缓存依赖项 

/// </summary> 

/// <returns></returns> 

private AggregateCacheDependency TableDependency() 

AggregateCacheDependency dependency = new AggregateCacheDependency(); 

dependency.Add(new SqlCacheDependency("MSPetShop4", "表名称"));  //当依赖多个表时可以类似这样的语句,在这里添加多个

return dependency; 

一个非常简单的方法,首先我们先看看两个.NET 2.0新增的两个类: 

AggregateCacheDependency在System.Web.Caching命名空间中,AggregateCacheDependency主要作用是用于组合 ASP.NET 应用程序的 Cache 对象中存储的项和 CacheDependency 对象的数组之间的多个依赖项。 

SqlCacheDependency也存在于System.Web.Caching命名空间中,这个类用于建立ASP.NET应用程序的Cache对象中存储的项和特定SQL Server数据库表之间的联系。 

SqlCacheDependency是如何建立Cache对象中存储的项和特定SQL Server数据库表之间的联系的呢?看一下Web.Config配置文件就一目了然了。 

<?xml version="1.0"?> 

<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0"> 

<connectionStrings> 

<add name="LocalConnString" connectionString="Server=(Local);uid=sa;pwd=123456;DataBase=MSPetShop4"/> 

</connectionStrings> 

<system.web> 

<caching> 

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

<databases> 

<!--
          name:必需的 String 属性。
              要添加到设置集合中的 SqlCacheDependencyDatabase 对象的名称。
              此名称用作 @ OutputCache 指令上 SqlDependency 属性的一部分。
          pollTime:设置 SqlCacheDependency 轮询数据库表以查看是否发生更改的频率(以毫秒计算)
          -->
<add name="MSPetShop4" connectionStringName="LocalConnString" pollTime="10000"/> 

</databases> 

</sqlCacheDependency> 

</caching> 

<compilation debug="true"/> 

</system.web> 

</configuration> 

配置节<databases><add name="MSPetShop4" connectionStringName="LocalConnString" pollTime="10000"/></databases>中配置了数据库信息,SqlCacheDependency类会自动完成对此配置节信息的读取以建立和数据库之间的联系。(注意)name="MSPetShop4"必须和new 

SqlCacheDependency("MSPetShop4", "表名称")中的数据库名称相一致。更多的配置信息可以查看(MSDN帮助文档)。 

使数据库支持SqlCacheDependency特性: 

要使得7.0或者2000版本的SQL Server支持SqlCacheDependency特性,需要对数据库服务器执行相关的配置步骤。有两种方法配置SQL Server: 

使用aspnet_regsql命令行工具,或者使用SqlCacheDependencyAdmin类。 

aspnet_regsql工具位于Windows\Microsoft.NET\Framework\[版本]文件夹中,如果要配置SqlCacheDependency,则需要以命令行的方式执行。 

以下是该工具的命令参数说明: 

-? 显示该工具的帮助功能; 

-S 后接的参数为数据库服务器的名称或者IP地址; 

-U 后接的参数为数据库的登陆用户名; 

-P 后接的参数为数据库的登陆密码; 

-E 当使用windows集成验证时,使用该功能; 

-d 后接参数为对哪一个数据库采用SqlCacheDependency功能; 

-t 后接参数为对哪一个表采用SqlCacheDependency功能; 

-ed 允许对数据库使用SqlCacheDependency功能; 

-dd 禁止对数据库采用SqlCacheDependency功能; 

-et 允许对数据表采用SqlCacheDependency功能; 

-dt 禁止对数据表采用SqlCacheDependency功能; 

-lt 列出当前数据库中有哪些表已经采用sqlcachedependency功能。 

比如在petshop4.0的数据库中使用SqlCacheDependency特性:aspnet_regsql -S localhost -E -d MSPetShop4 -ed 

以上面的命令为例,说明将对名为MSPetShop4的数据库采用SqlCacheDependency功能,且SQL Server采用了windows集成验证方式。我们还可以 

对相关的数据表执行aspnet_regsql命令,如: 

aspnet_regsql -S localhost -E -d MSPetShop4 -t Item -et 

aspnet_regsql -S localhost -E -d MSPetShop4 -t Product -et 

aspnet_regsql -S localhost -E -d MSPetShop4 -t Category -et 

最后为使用缓存: 

protected void Page_Load(object sender, EventArgs e) 

if (!IsPostBack) 

string key = "TableCache"; //缓存名称 

DataSet data = (DataSet)HttpRuntime.Cache[key]; //获取缓存 

// 判断缓存数据为空 

if (data == null) 

// 获取数据 

data = GetDataSource(); 

// 创建缓存依赖 

AggregateCacheDependency cd = TableDependency(); 

// 创建缓存 

HttpRuntime.Cache.Add(key, data, cd, DateTime.Now.AddHours(1), Cache.NoSlidingExpiration, 

CacheItemPriority.High, null); 

GridView1.DataSource = data; //绑定数据 

GridView1.DataBind(); 

获取数据源的方法,结合实际使用做修改。 

private DataSet GetDataSource() 

string ConnectionStringLocal = ConfigurationManager.ConnectionStrings["LocalConnString"].ConnectionString; 

SqlConnection connPubs = new SqlConnection(ConnectionStringLocal); 

SqlDataAdapter dad = new SqlDataAdapter("SELECT TOP 50 * FROM Product", connPubs); 

DataSet ds = new DataSet(); 

dad.Fill(ds); 

return ds; 

就这么简单:)

 

当需要缓存的记录集来自多个表时,就需要使用AggregateCacheDependency对象,

AggregateCacheDependency 确保,当保存集合内任意一对象(CacheDependency)失效时,使它关联的缓存数据也失效果,同时也会使AggregateCacheDependency内所有的对象失效,这点比较重要,其实可以根据实际需要在TableDependency()函数中添加多个类似下面语句一样的依赖项    

   dependency.Add(new SqlCacheDependency("MSPetShop4", "表名称")); 

如果其中一个失效,根据跟踪Sql Server Profilter 的结果看,当任意一项失效后(数据表数据更新),轮询就会停止,

直到用户重新建立一个AggregateChacheDependency为止,

转载于:https://www.cnblogs.com/dev-xp/archive/2010/01/12/1645276.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值