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

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()方法。

HostKvm:香港国际/韩国KVM夏季7折,2G内存套餐月付5.95美元起

HostKvm是一家成立于2013年的国外主机服务商,主要提供基于KVM架构的VPS主机,可选数据中心包括日本、新加坡、韩国、美国、中国香港等多个地区机房,均为国内直连或优化线路,延迟较低,适合建站或者远程办公等。目前商家发布了夏季特别促销活动,针对香港国际/韩国机房VPS主机提供7折优惠码,其他机房全场8折,优惠后2GB内存套餐月付5.95美元起。下面分别列出几款主机套餐配置信息。套餐:韩国KR...

ZJI全新上架香港站群服务器,4C段238个IP月付1400元起

ZJI本月新上线了香港葵湾机房站群服务器,提供4个C段238个IPv4,支持使用8折优惠码,优惠后最低每月1400元起。ZJI是原Wordpress圈知名主机商家:维翔主机,成立于2011年,2018年9月更名为ZJI,提供中国香港、台湾、日本、美国独立服务器(自营/数据中心直营)租用及VDS、虚拟主机空间、域名注册等业务,所选数据中心均为国内普遍访问速度不错的机房。葵湾二型(4C站群)CPU:I...

FBICDN,0.1元解决伪墙/假墙攻击,超500 Gbps DDos 防御,每天免费流量高达100G,免费高防网站加速服务

最近很多网站都遭受到了伪墙/假墙攻击,导致网站流量大跌,间歇性打不开网站。这是一种新型的攻击方式,攻击者利用GWF规则漏洞,使用国内服务器绑定host的方式来触发GWF的自动过滤机制,造成GWF暂时性屏蔽你的网站和服务器IP(大概15分钟左右),使你的网站在国内无法打开,如果攻击请求不断,那么你的网站就会是一个一直无法正常访问的状态。常规解决办法:1,快速备案后使用国内服务器,2,使用国内免备案服...

ie缓存文件夹在哪为你推荐
weipin唯品金融是什么?大家基本都怎么用呢?安装程序配置服务器失败安装用友u8的数据库最后说:“安装程序配置服务器失败。参考服务器错误日志和 C:WINDOWSsqlstp.log 了解更多信息。”无线路由器限速设置路由器里面限速参数如何设置?中国电信互联星空互联星空是什么?是电信公司的吗?ghostxp3GHOSTxp sp3系统有什么优点和缺点???百度抢票浏览器现在火车票越来越难买了,新版百度手机浏览器,除了抢票外,还有什么其他功能吗?工信部备案去国家工信部备案需要什么手续呢童之磊网文大学很强吗?彩信中心移动的彩信中心是?主页是?收不到彩信,怎么设置?iphone越狱后怎么恢复iPhone越狱后怎么恢复?
虚拟空间免费试用 论坛虚拟主机 网址域名注册 武汉域名注册 域名备案流程 ddos kdata 国内永久免费云服务器 英语简历模板word sub-process 服务器日志分析 商家促销 嘉洲服务器 大容量存储器 中国电信测网速 网络空间租赁 傲盾官网 支付宝扫码领红包 paypal注册教程 如何建立邮箱 更多