加入收藏 | 设为首页 | 会员中心 | 我要投稿 宁德站长网 (https://www.0593zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

在ASP.NET 2.0中操作数据之五十六:使用ObjectDataSource缓存数

发布时间:2016-11-23 22:27:45 所属栏目:MsSql教程 来源:站长网
导读:导言 就计算机科学而言,caching就是将所需要的数据或信息的备份放在某个地方,便于快速访问的这样一个过程。以数据处理(data-driven)程序为例,程序的大部分时间浪费在数据查询上。要提升这种程序的性能,通常的做法是将查询结果存放在程序的存储器里。

  图12揭示了ObjectDataSource的缓存流程。当文本“Selecting event fired”出现在屏幕上时,那是因为数据没有在缓存里找到,必须进行相关检索。当文本消失时,那是因为数据进行了缓存。当从缓存得到了所需的数据时,没有任何数据查询执行。

/uploads/allimg/c161121/14OI94B495P-1O5W1.png
图12:ObjectDataSource在Data Cache里存储和获取数据

  每一个ASP.NET应用程序有它自己的数据缓存实例,所有的页面和用户都可以进行访问。那意味着对于ObjectDataSource控件缓存的数据,所有登录该页面的用户都可以访问。来做个验证,在一个浏览器里打开ObjectDataSource.aspx页面,当第一次登录该页面时,文本“Selecting event fired”显现出来(假定前面测试时缓存的数据到此时已经被清除掉了)。再开第二个浏览器,将第一个浏览器里的URL地址拷贝、粘贴过来。在第二个浏览器里,文本“Selecting event fired”并没有显示出来,因为它使用的是第一个浏览器页面缓存的数据。

  当向内存添加检索数据时,ObjectDataSource要用到一个叫cache key的值,该值包括:CacheDuration 和 CacheExpirationPolicy属性的值;ObjectDataSource调用的业务对象的类型(type),它由TypeName 属性指定(比如:ProductsBLL);SelectMethod 属性的值,以及SelectParameters参数集里参数的name 和 values;StartRowIndex 和 MaximumRows属性的值,它用来执行用户自定义分页(custom paging)。

  将这些属性值组合在一起构成cache key值是为了对每一个缓存条目提供唯一的标识值。比如,在前面的教程里,我们使用ProductsBLL类的GetProductsByCategoryID(categoryID)方法来获取某个指定类的所有产品。假如一个用户在页面查看饮料类(其CategoryID值为1)的产品信息,如果ObjectDataSource控件在进行数据缓存时忽略SelectParameters的值,当另一个用户登录页面查看调味品类的产品信息时,恰好饮料类产品信息正好缓存在内存里,第二个用户将会看到饮料类的产品信息,而非他想要的调味品类的产品信息。所以,当cache key值包含electParameters的值的话,ObjectDataSource缓存数据的时候就可以将调味品类和饮料类区分开来。

数据更新不同步(Stale Data)问题

  当调用ObjectDataSource控件的Insert, Update和 Delete其中一个方法时,它都会将缓存条目从内存清除掉。这样做的好处在于当从页面修改数据时将缓存的旧数据清除掉。然而,ObjectDataSource还是可能有将“未更新数据”(也就是源数据已经发生改变,而缓存的数据没同步更新)显示出来的情况。最简单的例子是直接从数据库修改数据,比如某个数据库管理员运行一个脚本,修改数据库里的某些记录。

  在此,我们探讨一种微妙的情况。虽然调用ObjectDataSource的数据修改方法时它会将缓存数据清除掉,但清除的是那些与ObjectDataSource的“属性组合值”(combination of property)相匹配的缓存条目(比如CacheDuration, TypeName, SelectMethod等)。假如你有2个ObjectDataSources控件,它们更新相同的数据,当使用不同的SelectMethods 或 SelectParameters,当第一个ObjectDataSources控件更新某一行记录而清除该行对应的缓存数据时,第二个ObjectDataSources控件仍然使用该行对应的缓存数据。我们来做个验证,创建一个页面,包含可编辑的GridView控件,其对应的ObjectDataSource控件设置为使用缓存,且调用ProductsBLL类的GetProducts()方法来获取数据。在本页(或另外创建一个页面)再添加GridView 和ObjectDataSource控件,但是设置第二个ObjectDataSource控件调用GetProductsByCategoryID(categoryID)方法。由于这2个ObjectDataSource控件的SelectMethod属性不同,因此它们各自有各自不同的缓存值。如果你在第一个GridView控件里编辑某个产品,然后在第二个GridView控件里重新绑定数据(比如分页、排序等),我们在第二个GridView控件里看到该产品的值依然是“老的缓存数据”(而并不是第一个GridView控件修改后的值)

  简而言之,如果你乐于使用“老的缓存数据”,那只有使用基于时间的缓存时间值(time-based expiries,也就是设置具体的缓存时间长度),如果对数据及时更新要求很高的话,将缓存时间设短点。如果不允许使用“老的缓存数据”的话,要么放弃缓存,要么使用SQL cache dependencies(你可以认为它是你缓存的数据库数据)。我们将在后面探讨SQL cache dependencies。

总结:

  在本文我们考察了ObjectDataSource内建的缓存功能。仅仅设置很少的属性,我们可以将ObjectDataSource调用SelectMethod方法得到的数据进行缓存。其CacheDuration 和 CacheExpirationPolicy属性指定了缓存的时间和类型(absolute或sliding)。而CacheKeyDependency属性将ObjectDataSource的缓存实体与现有的缓存从属体(cache dependency)关联起来,一般是SQL cache dependencies。

  因为ObjectDataSource只是简单地进行数据缓存,我们可以通过编程实现ObjectDataSource内建的这种功能。不过在表现层这样做没有意义,因为ObjectDataSource控件提供了该功能。不过我们可以在体系结构的其它层次实现缓存功能。为此,我们需要一个逻辑,它与ObjectDataSource调用的相同。在下一篇文章我们将考察如何在体系结构内部编程处理数据缓存。

  祝编程快乐!

作者简介

  本系列教程作者 Scott Mitchell,著有六本ASP/ASP.NET方面的书,是4GuysFromRolla.com的创始人,自1998年以来一直应用 微软Web技术。大家可以点击查看全部教程《[翻译]Scott Mitchell 的ASP.NET 2.0数据教程》,希望对大家的学习ASP.NET有所帮助。

(编辑:宁德站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读