在ASP.NET 2.0中操作数据之五十八:在程序启动阶段(2)

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

Application["key"] = value; object value = Application["key"];

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

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

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

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

/uploads/allimg/200612/1JH19116_0.bmp


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

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

[System.ComponentModel.DataObject] public class StaticCache { private static Northwind.SuppliersDataTable suppliers = null; public static void LoadStaticCache() { // Get suppliers - cache using a static member variable SuppliersBLL suppliersBLL = new SuppliersBLL(); suppliers = suppliersBLL.GetSuppliers(); } [DataObjectMethodAttribute(DataObjectMethodType.Select, true)] public static Northwind.SuppliersDataTable GetSuppliers() { return suppliers; } }

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

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

[System.ComponentModel.DataObject] public class StaticCache { public static void LoadStaticCache() { // Get suppliers - cache using application state SuppliersBLL suppliersBLL = new SuppliersBLL(); HttpContext.Current.Application["key"] = suppliersBLL.GetSuppliers(); } [DataObjectMethodAttribute(DataObjectMethodType.Select, true)] public static Northwind.SuppliersDataTable GetSuppliers() { return HttpContext.Current.Application["key"] as Northwind.SuppliersDataTable; } }

  在LoadStaticCache()方法里,supplier信息是存储在application变量key里。在GetSuppliers()方法里,它作为Northwind.SuppliersDataTable类型返回。由于我们可以在ASP.NET页面的后台代码里使用Application["key"]来访问application state,所以,在这里我们必须使用HttpContext.Current.Application["key"]来获取当前的HttpContext。

同样,我们可以使用data cache,如下所示:

[System.ComponentModel.DataObject] public class StaticCache { public static void LoadStaticCache() { // Get suppliers - cache using the data cache SuppliersBLL suppliersBLL = new SuppliersBLL(); HttpRuntime.Cache.Insert( /* key */ "key", /* value */ suppliers, /* dependencies */ null, /* absoluteExpiration */ Cache.NoAbsoluteExpiration, /* slidingExpiration */ Cache.NoSlidingExpiration, /* priority */ CacheItemPriority.NotRemovable, /* onRemoveCallback */ null); } [DataObjectMethodAttribute(DataObjectMethodType.Select, true)] public static Northwind.SuppliersDataTable GetSuppliers() { return HttpRuntime.Cache["key"] as Northwind.SuppliersDataTable; } }

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

  注意:本文下载代码里的StaticCache class类使用的是 static member变量技术,关于application state 和 data cache技术的代码可以在类文件(class file)里的注释部分找到。

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjwwgg.html