缓存五十八在程序启动阶段缓存数据

ie缓存文件夹在哪  时间:2021-02-15  阅读:()

在AS P.N ET 2.0中操作数据之五十八在程序启动阶段缓存数据

作者 h e ke r2007字体 [增加减小]类型转载时间 2016-05-17我要评论

前面我们分别介绍了在ObjectDataSource缓存数据和在分层架构中缓存数据本文介绍ASP.NET 2.0中在程序启动阶段在Globa l.asax文件中缓存数据。

导言

前面2章考察了在表现层和缓存层缓存数据。在第56章我们探讨了在表现层设置ObjectDataSource的相关cache属性来缓存数据。在第57章我们探讨了创建一个单独的分开的缓存层。这2章都是采用―应激装载‖ reactive loading的模式来缓存数据。该模式下每次请求数据时系统先检查其是否在内存如果没有则从数据源——比如数据库来获取数据然后将其存储在内存里。该模式的优势在于执行起来很容易而缺点之一在于应―请求‖ req uests而执行。试想一下在前面章节我们通过缓存层来展示产品信息当第一次登录该页面或缓存数据因为缓存时间结束等原因从内存清除以后再次访问该页面时因为数据没有储存在内存里请求只能从数据库获取数据。这样一来花的时间就比直接从内存获取数据要长一些。

―预装载‖(Proactive loading)可以使用2种模式来预装载数据。第一种模式 Proactiveload ing使用一些方法( process)来判断源数据(underlying data)是否发生改变并及时对缓存数据进行更新——比如周期性的检查源数据或者当源数据发生改变时立即通知更新。不过该模式的弊端在于执行起来比较困难你必须创建、管理、执行一个具体的方法来检查源数据的更改情况 以更新缓存数据。

另一个模式同时也是本文要探讨的内容就是在程序启动时便装载数据入内存。该模式对缓存静态数据(static data)尤其有用 比如查找数据库表里的记录。

注意关于―应激装载‖(reactive loading)和―预装载‖(proactive loading)的区别请参考文章《 Caching Architecture Guide for .NET Framework Appl ications》的《Managing the Contents of a Cache》章节 (http://msdn2.microsoft.com/en-us/l ibrary/ms.aspx)第一步在程序启动阶段决定缓存哪些数据

我们在前面2章探讨的reactive loading模式的示例适合处理这些数据周期性地改变且生成(generate)数据不需要太长的时间。但是如果缓存的数据从未改变那么reactiveload ing模式使用的周期(ex p iry)就显的有点多余。另外如果需要缓存的数据要花很长的时间才能生产 当用户请求发现内存为空时用户将等很长的时间来检索并返回数据。对此可以考虑将静态数据和需要很长时间才能生成的数据在程序启动阶段就缓存。

虽然数据库有很多动态的经常改变的值不过静态值也不少。举例数据库表Patients有一个PrimaryLanguage列其值可以为English, Span ish, French, Russian, Japanese等。不过我们不会直接在表Patients里存储―Engl ish‖或―French‖等字符串而是在供查找的表Languages里存储。如图1 John Doe的primary language是Engl ish而Ed Johnson的是Russian.

图1表Languages为表Patients所使用的查找表

在编辑或创建新patient的用户界面里将包含一个下拉列表框列出表Languages里的所有语言项。不缓存的话每次登录该界面系统都会查询表Languages这样显地和浪费也没有必要。因为表Languages不会频繁的改变。

我们可以用前面探讨的reactive load ing模式来对数据Languages进行缓存。不过 reactive loading模式会使用基于时间的缓存周期(time-based expiry),这对静态数据来说没有必要。最好的办法是在程序启动阶段进行预装载。

在本文我们将探讨如何缓存―查找表‖(lookup table,例如Languages表对Patients表来说就是查找表)数据和其它的静态信息。

第二步考察缓存数据的不同途径

在一个AS P.N ET应用程序里我们可以使用多种方法来缓存信息。在前面的教程我们看到的是data cache其实通过使用static members(静态成员)或appl ication state(应用程序状态)我们也可以将对象(o bjects)缓存。

当处理一个类时我们在访问其成员(members)前应先实例化。比如为了调用BLL层里的一个方法我们首先要创建该类的实例

?

在调用SomeMethod或处理SomeProperty之前我们必须首先用关键字new来创建一个类的实例。 SomeMethod和SomeProperty要与一个具体的实例对应起来这些成员的生命周期(l ifetime)取决与对应对象的生命周期。另一方面 Static members 比如变量、属性、方法等对该类的所有实例来说都是共享的因此其生命周期与该类的生命周期一样长。 Static members要用关键字static来标识。

除了static members外还可以使用appl ication state。每一个ASP.NET应用程序都包含一个name/value集它对应用程序的所有页面和用户都是共享的。可以通过HttpContext class类的Appl icat ion property属性来访问它。在页面的后台代码我们可以这样访问它

?

data cache提供了丰富的缓存数据的API(应用程序接口)基于时间和从属体的缓存周期(time- and dependency-based expiries)的机制以及cache item priorities等。在本文我们将看到3种缓存静态数据的技术。

第三步缓存Suppliers Table表的数据

我们用到的Northwind数据库并没有―查找表‖(lookup tables),DAL层用到的4个表的值也并非静态的。没必要花时间来向DAL层添加一个新数据库表再在B LL层添加新的类和新的方法我们在本教程假定表Su p p lie rs的数据是静态的 因此我们在程序启动是缓存其数据。

首先我们在CL文件夹里创建一个名为StaticCache.cs的新类。

图2:在CL文件夹里创建StaticCache.cs类

我们需要添加一个在程序启动时装载数据的方法 同样还有一个从内存返回数据的方法。?

在上述代码里我们在LoadStaticCache()方法里用一个static member变量suppl iers来保存Suppl iersBLL类的GetSuppl iers()方法返回的结果。该LoadStaticCache()方法应该在程序启动阶段就被调用。一旦数据在启动时就被加载到内存任何要用到suppl ier信息的页面都可以调用StaticCache class类的GetSuppl iers()方法。因此访问数据库获取suppl iers信息的情况只会发生一次就是在启动阶段。

除了static member变量外我们还可以使用appl ication state或data cache。下面的代码将类进行修改它使用appl ication state:

?

在LoadStaticCache()方法里 su ppl ier信息是存储在appl icat ion变量key里。在GetSu ppl iers()方法里它作为Northwind.Su ppl iersDataTab le类型返回。 由于我们可以在ASP.NET页面的后台代码里使用Appl ication["key"]来访问appl icat ion state所以在这里我们必须使用HttpCo ntext.C u rrent.Ap p l icatio n["key"]来获取当前的HttpCo ntext。

同样我们可以使用data cache如下所示

?

23

向data cache添加一个条目且没指定时间周期(no time-based expiry)为此我们System.Web.Caching.Cache.NoAbsoluteExpiration和System.Web.Caching.Cache.NoSlid ingExpirat ion值作为输入参数之一。在上面的data cache的Insert()方法里我们指定了缓存条目的优先级(priority).优先级用以指明当内存容量不足时哪些条目应从内存移除。在此我们将优先级设为不可移除(也就是对应的nul l)这就确保了当内存不足时不会将其移除。

注意本文下载代码里的StaticCache class类使用的是static member变量技术关于applicationstate和data cache技术的代码可以在类文件(class fi le)里的注释部分找到。

第四步在程序启动是执行代码

为了在程序启动时执行代码我们需要创建一个名为Globa l.asax的文件。该文件包含了a p p l ic at io n、 se ss io n和req u est级事件的事件处理器。在该文件里我们将添加在程序启动时要执行的代码。

要在网站根目录里添加Globa l.asax文件在Visua l Studio解决资源管理器里右击网站项目选Add New Item从Add New Item对话框里选择Global应用程序项目类型,然后点Add按钮。

注意如果你的根目录里已经存在Global.asax文件 Global应用程序项目类型就不会出现在Add New Item对话框里。

图3在根目录添加Global.asax文件。

默认的Globa l.asax文件里包括了5个方法每个方法都有一个服务器端(server-side)<scr ipt>标记

Ap p l icat io n_Sta rt–当程序启动时执行

Ap p l ic at io n_E n d –当程序完结时执行

Appl icat io n_Error–每当程序发生未经处理(u n hand led)的异常时发生。

Sess io n_Sta rt–当创建一个sessio n时执行

Sess io n_E n d –当sessio n完结时或被移除时发生

Appl icat ion_Start事件处理器在程序的生命周期(l ife cycle)里只发生一次。程序起始于一个AS P.N ET资源(reso u rce)首次被请求持续运行直到程序重新启动为止。关于程序生命周期的更多细节请参阅文章《ASP.NET Appl ication Life Cycle Overview》 http://msdn2.microsoft.com/en-us/l ibrary/ms.aspx

本文我们只需要为Ap p l icat io n_Sta rt方法添加代码放心大胆的将其它方法删除。在Appl icat ion_Start里仅仅调用StaticCacheclass类的LoadStaticCache()方法。这将装载并缓存supplier信息

?

要做的就是这些在程序开始时 LoadStaticCache()方法会从BLL获取suppl ier信息再存储进一个static member变量(或是你在StaticCache class类里面用的其它一些cachesto re)。为验证起见在Ap p l icatio n_Start方法里设置断点(b reakpo int)并执行程序。另外在并发请求(Su bseq uent req uests)时不会执行Appl icat ion_Start方法。

图4用B reakpoint来验证Applicat ion_Start事件处理器的执行

注意如果你在首次调试时没有遇到Application_Start breakpoint那是因为你的程序已经启动了。可以修改Global.asax或Web.config文件来强迫程序重新启动。你仅仅在这些文件的末尾添加(或删除)一个空白行来快速的重启程序。

第五步展示缓存数据

现在 StaticCache class类在程序启动时将suppl ier相关的数据进行了缓存。要在表现层使用这些数据我们可以在ASP.NET页面的后台代码通过ObjectDataSou rce控件或编程调用StaticCache class类的GetSuppl iers()方法。让我们看看如何使用ObjectDataSource和GridView控件来展示缓存的su ppl ier信息。

首先打开文件夹里的AtAp p l icatio n Sta rtu p.aspx页面在―设计‖模式里从工具箱里拖一个GridView控件到页面设置其ID为Su ppliers。然后从其智能标签里选择创建一个新的ObjectDataSource名为Suppl iersCachedDataSource设置它使用StaticCache class类的GetSuppliers()方法。

HostYun 新增美国三网CN2 GIA VPS主机 采用美国原生IP低至月15元

在之前几个月中也有陆续提到两次HostYun主机商,这个商家前身是我们可能有些网友熟悉的主机分享团队的,后来改名称的。目前这个品牌主营低价便宜VPS主机,这次有可以看到推出廉价版本的美国CN2 GIA VPS主机,月费地址15元,适合有需要入门级且需要便宜的用户。第一、廉价版美国CN2 GIA VPS主机方案我们可看到这个类型的VPS目前三网都走CN2 GIA网络,而且是原生IP。根据信息可能后续...

六一云互联(41元)美国(24元)/香港/湖北/免费CDN/免费VPS

六一云互联六一云互联为西安六一网络科技有限公司的旗下产品。是一个正规持有IDC/ISP/CDN的国内公司,成立于2018年,主要销售海外高防高速大带宽云服务器/CDN,并以高质量.稳定性.售后相应快.支持退款等特点受很多用户的支持!近期公司也推出了很多给力的抽奖和折扣活动如:新用户免费抽奖,最大可获得500元,湖北新购六折续费八折折上折,全场八折等等最新活动:1.湖北100G高防:新购六折续费八折...

6元虚拟主机是否值得购买

6元虚拟主机是否值得购买?近期各商家都纷纷推出了优质便宜的虚拟主机产品,其中不少6元的虚拟主机,这种主机是否值得购买,下面我们一起来看看。1、百度云6元体验三个月(活动时间有限抓紧体验)体验地址:https://cloud.baidu.com/campaign/experience/index.html?from=bchPromotion20182、Ucloud 10元云主机体验地址:https:...

ie缓存文件夹在哪为你推荐
怎么在qq空间里添加背景音乐如何在qq空间中添加背景音乐百度抢票浏览器手机百度浏览器抢票版根本就没预约抢票。噱头而已!网站运营我想成为网站运营的人我该学什么??百度手写百度手写显示ps抠图技巧photoshop抠图技巧今日热点怎么删除怎么删除手机百度实时热点天天酷跑刷金币如何使用八门神器给天天酷跑刷钻刷金币迅雷云点播账号求百度云或者迅雷云播账号密码机械键盘轴机械键盘的轴哪种好?freebsd安装FreeBSD怎么安装
哈尔滨域名注册 万网域名空间 vpsio java主机 themeforest 私人服务器 debian6 域名转接 世界测速 免费智能解析 万网空间购买 512mb 789 英国伦敦 服务器防火墙 重庆服务器 存储服务器 闪讯网 最新优惠 美国服务器 更多