• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ASP.NET > 在ASP.NET 2.0中操作数据之五十八:在程序启动阶段缓存数据

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

作者:heker2007 字体:[增加 减小] 来源:互联网 时间:2017-05-11

heker2007通过本文主要向大家介绍了asp.net,asp net培训,asp和asp.net的区别,零基础学asp.net,c#和asp.net的区别等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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

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

  另一个模式,同时也是本文要探讨的内容,就是在程序启动时便装载数据入内存。该模式对缓存静态数据(static data)尤其有用,比如查找数据库表里的记录。
注意:关于“应激装载”(reactive loading)和“预装载”(proactive loading)的区别,请参考文章《 Caching Architecture Guide for .NET Framework Applications》的《Managing the Contents of a Cache》章节:(http://msdn2.microsoft.com/en-us/library/ms978503.aspx)

第一步:在程序启动阶段决定缓存哪些数据

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

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

http://files.weikejianghu.com/file_images/article/201605/2016051711473960.bmp
图1:表Languages为表Patients所使用的查找表

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

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

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

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

  在一个ASP.NET应用程序里,我们可以使用多种方法来缓存信息。在前面的教程我们看到的是data cache,其实通过使用static members(静态成员)或application state(应用程序状态)我们也可以将对象(objects)缓存。

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

ProductsBLL productsAPI = new ProductsBLL();
productsAPI.SomeMethod();
productsAPI.SomeProperty = "Hello, World!";
</div>

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

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

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

</div>

  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的新类。

http://files.weikejianghu.com/file_images/article/201605/2016051711473961.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;
 }
}
</div>

  在上述代码里,我们在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;
 }
}

</div>

  在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,
 



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Asp.net SignalR 应用并实现群聊功能 开源代码
  • asp.net动态更新
  • asp.net利用母版制作页脚效果
  • Asp.Net服务器发送HTTP标头后无法设置内容类型的问题解决
  • 使用asp.net mvc,boostrap及knockout.js开发微信自定义菜单编辑工具(推荐)
  • 详解ASP.NET MVC 常用扩展点:过滤器、模型绑定
  • ASP.NET Core发送邮件的方法
  • 在ASP.NET Core 中发送邮件的实现方法(必看篇)
  • ASP.NET MVC从视图传参到控制器的几种形式
  • Asp.net core WebApi 使用Swagger生成帮助页实例

相关文章

  • 2017-05-11详解ABP框架的参数有效性验证和权限验证
  • 2017-05-11ASP.NET中上传并读取Excel文件数据示例
  • 2017-05-11Asp.net 网站性能优化二则分享
  • 2017-05-11解决asp.net ajax sys未定义的解决方法
  • 2018-08-20一个简单的ASP.NET验证码
  • 2017-05-11ASP.NET 链接 Access 数据库路径问题最终解决方案
  • 2017-05-11asp.net+Ligerui实现grid导出Excel和Word的方法
  • 2017-05-11ASP.NET SignaiR 实现消息的即时推送,并使用Push.js实现通知的示例代码
  • 2017-05-11.net中mshtml处理html的方法
  • 2017-05-11.NET验证组件Fluent Validation使用指南

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • ASP.NET缓存处理类实例
    • ABP框架中的日志功能完全解析
    • Asp.net后台把脚本样式输出到head标签中节省代码冗余
    • asp.net获取真实ip的方法
    • 实例解析Java中的synchronized关键字与线程安全问题
    • 微信语音上传 下载功能实例代码
    • ASP.NET中Cookie状态的说明与用法
    • asp.net用url重写URLReWriter实现任意二级域名 高级篇
    • aspx 中文汉字显示为乱码
    • asp.net通过HttpModule自动在Url地址上添加参数

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有