ter.Fill(ds,"Employees");
CacheItemRemovedCallback onRemove = new CacheItemRemovedCallback(RefreshCache);
string depFile= ConfigurationSettings.AppSettings["dependencyFile"].ToString();
HttpContext.Current.Cache.Insert("Employees",ds,new CacheDependency(depFile),
Cache.NoAbsoluteExpiration,Cache.NoSlidingExpiration,
CacheItemPriority.High,onRemove);
blnReflash = true;
}
}
就像上面看到的一样,我们定义了一个Cache类型的_cache对象,在Application_Start方法中,我们把当前的Cache实例赋给它,然后调用RefreshCache方法去填充该对象。RefreshCache实际上是一个静态的委托回调方法,它所做的就是简单的从Empoyees表中取得一个DataSet,然后创建CacheItemRemovedCallback类型的委托OnRemove,使其指向RefreshCache方法,这样当被监控的文件变化时,也就是缓存失效时,就会调用该委托,刷新缓存中的数据。
最后我们把DataSet连同OnRemove委托一起插入到缓存中,在Session_Start中,为了“保险“,我另外添加了一个判断来调用RefreshCache方法填充缓存。
到这里,我们应用程序就创建好了,在任何页面中都可以访问到缓存的DataSet。在WebForm1aspx中,我演示了如何使用它。
[C#]
private void Page_Load(object sender, System.EventArgs e)
{
//保证缓存非空,如果为空,则填充它
if(Cache["Employees"] == null)
Global.RefreshCache(null,null, 0);
cacheStatus.Text = "Cache Refreshed at "+ DateTime.Now.ToLongTimeString();
else
cacheStatus.Text = " DataSet from Cache ";
DataSet ds = (DataSet)Cache["Employees"];
DataGrid1.DataSource= ds.Tables[0];
DataGrid1.DataBind();
}
现在,如果你请求这个页面,它将会每次成功的显示从从Cache中取得的DataSet,如果你保持浏览器打开,同时打开SQL Server的查询分析器,选择Northwind数据库,执行SQL语句''''Update Employees set Lastname = ''''Davovlieu'''' where EmployeeID =1'''',更新表中的记录,然后重新请求该页面,你将会看到缓存已经失效并刷新。
译者按:关于基于数据库的缓存依赖,gotdotnet上也有一个用DataSet实现的(Rob Howard 实现) ASP.NET Cache Invalidation on Database Change,
目前在ASP.NET1.1版本没有非常自然的解决方案,值得欣慰的是,随Whidbey一起发布的ASP.NET2.0,还有Yuku,从数据层提供了一个不错的实现。让我们拭目以待!
下面的工程是Visual Studio.NET 2003格式。
下载本文工程
上一页 [1] [2] [C语言系列]NET 中C#的switch语句的语法 [系统软件]托拽Explore中的文件到VB.net的窗口 [系统软件]Boost库在XP+Visual C++.net中的安装 [常用软件]新配色面板:Paint.Net3.0RC1官方下载 [常用软件]用内建的“Net Meeting”聊天 [VB.NET程序]Henry的VB.NET之旅(三)—共享成员 [VB.NET程序]Henry的VB.NET之旅(二)—构造与析构 [VB.NET程序]Henry的VB.NET之旅(一)—失踪的窗体 [VB.NET程序]在托盘上显示Balloon Tooltip(VB.NET) [VB.NET程序]Henry手记-VB.NET中动态加载Treeview节点(二)
|