您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 五十八在程序启动阶段缓存数据
在ASP.NET2.0中操作数据之五十八:在程序启动阶段缓存数据作者:heker2007字体:[增加减小]类型:转载时间:2016-05-17我要评论前面我们分别介绍了在ObjectDataSource缓存数据和在分层架构中缓存数据,本文介绍ASP.NET2.0中在程序启动阶段在Global.asax文件中缓存数据。导言:前面2章考察了在表现层和缓存层缓存数据。在第56章,我们探讨了在表现层设置ObjectDataSource的相关cache属性来缓存数据。在第57章,我们探讨了创建一个单独的分开的缓存层。这2章都是采用“应激装载”(reactiveloading)的模式来缓存数据。该模式下,每次请求数据时,系统先检查其是否在内存,如果没有,则从数据源——比如数据库,来获取数据,然后将其存储在内存里。该模式的优势在于执行起来很容易;而缺点之一在于应“请求”(requests)而执行。试想一下,在前面章节,我们通过缓存层来展示产品信息,当第一次登录该页面,或缓存数据因为缓存时间结束等原因从内存清除以后,再次访问该页面时,因为数据没有储存在内存里,请求只能从数据库获取数据。这样一来花的时间就比直接从内存获取数据要长一些。“预装载”(Proactiveloading)可以使用2种模式来预装载数据。第一种模式,Proactiveloading使用一些方法(process)来判断源数据(underlyingdata)是否发生改变,并及时对缓存数据进行更新——比如,周期性的检查源数据;或者当源数据发生改变时,立即通知更新。不过该模式的弊端在于执行起来比较困难,你必须创建、管理、执行一个具体的方法来检查源数据的更改情况,以更新缓存数据。另一个模式,同时也是本文要探讨的内容,就是在程序启动时便装载数据入内存。该模式对缓存静态数据(staticdata)尤其有用,比如查找数据库表里的记录。注意:关于“应激装载”(reactiveloading)和“预装载”(proactiveloading)的区别,请参考文章《CachingArchitectureGuidefor.NETFrameworkApplications》的《ManagingtheContentsofaCache》章节:()第一步:在程序启动阶段决定缓存哪些数据我们在前面2章探讨的reactiveloading模式的示例适合处理这些数据:周期性地改变且生成(generate)数据不需要太长的时间。但是,如果缓存的数据从未改变,那么reactiveloading模式使用的周期(expiry)就显的有点多余。另外,如果需要缓存的数据要花很长的时间才能生产,当用户请求发现内存为空时,用户将等很长的时间来检索并返回数据。对此,可以考虑将静态数据和需要很长时间才能生成的数据在程序启动阶段就缓存。虽然,数据库有很多动态的,经常改变的值;不过静态值也不少。举例,数据库表Patients有一个PrimaryLanguage列,其值可以为English,Spanish,French,Russian,Japanese等。不过我们不会直接在表Patients里存储“English”或“French”等字符串,而是在供查找的表Languages里存储。如图1:JohnDoe的primarylanguage是English,而EdJohnson的是Russian.图1:表Languages为表Patients所使用的查找表在编辑或创建新patient的用户界面里,将包含一个下拉列表框,列出表Languages里的所有语言项。不缓存的话,每次登录该界面,系统都会查询表Languages,这样显地和浪费也没有必要。因为表Languages不会频繁的改变。我们可以用前面探讨的reactiveloading模式来对数据Languages进行缓存。不过,reactiveloading模式会使用基于时间的缓存周期(time-basedexpiry),这对静态数据来说没有必要。最好的办法是在程序启动阶段进行预装载。在本文,我们将探讨如何缓存“查找表”(lookuptable,例如Languages表对Patients表来说就是查找表)数据和其它的静态信息。第二步:考察缓存数据的不同途径在一个ASP.NET应用程序里,我们可以使用多种方法来缓存信息。在前面的教程我们看到的是datacache,其实通过使用staticmembers(静态成员)或applicationstate(应用程序状态)我们也可以将对象(objects)缓存。当处理一个类时,我们在访问其成员(members)前,应先实例化。比如,为了调用BLL层里的一个方法,我们首先要创建该类的实例:?123ProductsBLLproductsAPI=newProductsBLL();productsAPI.SomeMethod();productsAPI.SomeProperty=Hello,World!;在调用SomeMethod或处理SomeProperty之前,我们必须首先用关键字new来创建一个类的实例。SomeMethod和SomeProperty要与一个具体的实例对应起来,这些成员的生命周期(lifetime)取决与对应对象的生命周期。另一方面,Staticmembers,比如变量、属性、方法等,对该类的所有实例来说都是共享的,因此其生命周期与该类的生命周期一样长。Staticmembers要用关键字static来标识。除了staticmembers外,还可以使用applicationstate。每一个ASP.NET应用程序都包含一个name/value集,它对应用程序的所有页面和用户都是共享的。可以通过HttpContextclass类的Applicationproperty属性来访问它。在页面的后台代码我们可以这样访问它:?12Application[key]=value;objectvalue=Application[key];datacache提供了丰富的缓存数据的API(应用程序接口),基于时间和从属体的缓存周期(time-anddependency-basedexpiries)的机制,以及cacheitempriorities等。在本文,我们将看到3种缓存静态数据的技术。第三步:缓存SuppliersTable表的数据我们用到的Northwind数据库并没有“查找表”(lookuptables),DAL层用到的4个表的值也并非静态的。没必要花时间来向DAL层添加一个新数据库表,再在BLL层添加新的类和新的方法,我们在本教程假定表Suppliers的数据是静态的,因此我们在程序启动是缓存其数据。首先,我们在CL文件夹里创建一个名为StaticCache.cs的新类。图2:在CL文件夹里创建StaticCache.cs类我们需要添加一个在程序启动时装载数据的方法;同样,还有一个从内存返回数据的方法。?12345[System.ComponentModel.DataObject]publicclassStaticCache{privatestaticNorthwind.SuppliersDataTablesuppliers=null;publicstaticvoidLoadStaticCache(){67891011121314151617//Getsuppliers-cacheusingastaticmembervariableSuppliersBLLsuppliersBLL=newSuppliersBLL();suppliers=suppliersBLL.GetSuppliers();}[DataObjectMethodAttribute(DataObjectMethodType.Select,true)]publicstaticNorthwind.SuppliersDataTableGetSuppliers(){returnsuppliers;}}在上述代码里,我们在LoadStaticCache()方法里,用一个staticmember变量suppliers来保存SuppliersBLL类的GetSuppliers()方法返回的结果。该LoadStaticCache()方法应该在程序启动阶段就被调用。一旦数据在启动时就被加载到内存,任何要用到supplier信息的页面都可以调用StaticCacheclass类的GetSuppliers()方法。因此,访问数据库获取suppliers信息的情况只会发生一次,就是在启动阶段。除了staticmember变量外,我们还可以使用applicationstate或datacache。下面的代码将类进行修改,它使用applicationstate:?123456789101112[System.ComponentModel.DataObject]publicclassStaticCache{publicstaticvoidLoadStaticCache(){//Getsuppliers-cacheusingapplicationstateSuppliersBLLsuppliersBLL=newSuppliersBLL();HttpContext.Current.Application[key]=suppliersBLL.GetSuppliers();}[DataObjectMethodAttribute(DataObjectMethodType.Select,true)]publicstaticNorthwind.SuppliersDataTableGetSuppliers(){returnHttpContext.Current.Application[key]asNorthwind.SuppliersDataTable;}}13141516在LoadStaticCache()方法里,supplier信息是存储在application变量key里。在GetSuppliers()方法里,它作为Northwind.SuppliersDataTable类型返回。由于我们可以在ASP.NET页面的后台代码里使用Application[key]来访问applicationstate,所以,在这里我们必须使用HttpContext.Current.Application[key]来获取当前的HttpContext。同样,我们可以使用datacache,如下所示:?12345678910111213141516171819202122[System.ComponentModel.DataObject]publicclassStaticCache{publicstaticvoidLoadStaticCache(){//Getsuppliers-cacheusingthedatacacheSuppliersBLLsuppliersBLL=newSuppliersBLL();HttpRuntime.Cache.Insert(/*key*/key,/*value*/suppliers,/*dependencies*/null,/*absoluteExpiration*/Cache.NoAbsoluteExpiration,/*slidingExpiration*/Cache.NoSlidingExpiration,/*priority*/CacheItemPriority.NotRemovable,/*onRemoveCallback*/null);}[DataObjectMethodAttribute(DataObjectMethodType.Select,true)]publicstaticNorthwind.SuppliersDataTableGetSuppliers(){returnHttpR
本文标题:五十八在程序启动阶段缓存数据
链接地址:https://www.777doc.com/doc-2741399 .html