五十六使用ObjectDataSource缓存数据Word格式.docx
《五十六使用ObjectDataSource缓存数据Word格式.docx》由会员分享,可在线阅读,更多相关《五十六使用ObjectDataSource缓存数据Word格式.docx(17页珍藏版)》请在冰豆网上搜索。
![五十六使用ObjectDataSource缓存数据Word格式.docx](https://file1.bdocx.com/fileroot1/2022-10/29/f2fbf145-dac6-4081-a483-11fa0d53130c/f2fbf145-dac6-4081-a483-11fa0d53130c1.gif)
在本文及接下来的3篇文章我们将对ObjectDataSource的缓存属性以及datacache进行考察;
我们也将探究如何在启动时对application-wide数据进行缓存,以及通过使用SQLcachedependencies对缓存数据刷新。
主要的缓存要点
由于缓存通过将数据的副本放置在一个便于快速访问的地方来提高程序的总体性能。
由于它仅仅是一个副本,当源数据发生改变时,副本不能同步更新。
为此,页面开发员应制定一个标准将其清除出内存,可以使用如下的2种方法之一:
Time-based标准:
向内存添加的条目(item),只能在内存里驻留固定或灵活(sliding)的一段时间。
比如,开发者可设定一个时间段,比如60秒,当条目添加到内存后,不管访问它的频率有多高,60秒后就会被清除掉;
如果是灵活(sliding)处理的话,当最后一次被访问后,未再次被访问的时间一旦超出60秒,也会被清除掉。
Dependency-based标准:
当向内存添加条目时为其分配一个从属体(dependency),当条目对应的从属体发生改变时将条目清除掉。
从属体可以是一个文件;
另一个缓存条目;
或者干脆是这两者的混合体(combination);
当然还可以是SQLcachedependencies,它可以向内存添加条目,当源数据改变时将条目清除掉。
我们将在接下来的文章《使用SQL缓存依赖项SqlCacheDependency
》里详细考察。
不管是哪种标准,在条目被清除掉以前,我们都可以对其访问。
如果内存达到了它的极限,它会清除掉已有的条目后再添加新的条目。
因此,当处理缓存数据时很重要的一点是我们要充分考虑到缓存数据已被清除的可能。
在下一篇文章《在分层架构中缓存数据》我们考察采用哪种模式从内存访问数据。
缓存是提升程序性能的一种较为经济的方法,就像StevenSmith在他的文章《ASP.NETCaching:
TechniquesandBestPractices:
》里阐述的一样:
“缓存是获得‘上佳'
性能的一种好方法,不需要太多的时间和分析。
…存储器也便宜,要获得你期望的性能,靠缓存技术你需要花30秒;
靠优化代码和数据库你可能要几天乃至几周时间…”
虽然缓存可以显而易见的提升系统性能,但并不是适用于所有的应用程序,比如某些实时(real-time)、频繁更新数据的程序就不适合。
但是对大部分程序而言,还是适用的。
关于ASP.NET2.0里的缓存的更多背景资料请参考ASP.NET2.0QuickStartTutorials系列的CachingforPerformance部分。
第一步:
创建Caching页面
在我们开始以前,首先让我们花些时间来添加包括本篇在内的最近四篇教程需要用到的页面。
我们先在项目中新建一个称作Caching的文件夹,接下来,为目录新增以下几个页面,并配置为使用Site.master母板页。
Default.aspx
ObjectDataSource.aspx
FromTheArchitecture.aspx
AtApplicationStartup.aspx
SqlCacheDependencies.aspx
图1:
创建相关的ASP.NET页面
像其它文件夹一样,Caching文件夹里的Default.aspx页面将本系列的文章显示出来。
记得用户控件SectionLevelTutorialListing.ascx提供该功能,设计模式里将其拖到页面上。
图2:
为Default.aspx页面添加用户控件SectionLevelTutorialListing.ascx
最后,将这些页面添加到Web.sitemap文件里,特别的,放在“WorkingwithBinaryData”<
siteMapNode>
:
之后:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<
siteMapNodetitle="
Caching"
url="
~/Caching/Default.aspx"
description="
LearnhowtousethecachingfeaturesofASP.NET2.0."
>
siteMapNodeurl="
~/Caching/ObjectDataSource.aspx"
title="
ObjectDataSourceCaching"
Explorehowtocachedatadirectlyfromthe
ObjectDataSourcecontrol."
/>
~/Caching/FromTheArchitecture.aspx"
CachingintheArchitecture"
Seehowtocachedatafromwithinthe
architecture."
~/Caching/AtApplicationStartup.aspx"
CachingDataatApplicationStartup"
Learnhowtocacheexpensiveorinfrequently-changing
queriesatthestartoftheapplication."
~/Caching/SqlCacheDependencies.aspx"
UsingSQLCacheDependencies"
Examinehowtohavedataautomaticallyexpirefromthe
cachewhenitsunderlyingdatabasedataismodified."
/siteMapNode>
完成Web.sitemap文件的更新后,让我们在浏览器里查看,左边的菜单栏显示caching章节的文章
图3:
网站地图SiteMap包含了Caching章节的文章
第二步:
在WebPage页面里展示产品
本文考察怎样使用ObjectDataSource控件内置(built-in)的缓存功能。
在开始之前,我们首先需要创建一个页面,用一个ObjectDataSource控件调用ProductsBLLclass类获取产品信息,再用GridView控件展示出来。
首先打开Caching文件夹里的ObjectDataSource.aspx页面。
从工具箱拖一个GridView控件到页面,设置其ID为Products,再从智能标签里选择将其绑定到一个ObjectDataSource控件,ID为ProductsDataSource。
设该ObjectDataSource使用ProductsBLLclass类。
图4:
设置ObjectDataSource控件使用ProductsBLLClass类
在本页面,我们要创建一个允许编辑的GridView控件,当ObjectDataSource控件里的缓存数据发生改变时,我们可以通过GridView的界面查看到底会发生什么。
在SELECT标签里选择默认的GetProducts()方法,但是在UPDATE标签里选择接受productName,unitPrice和productID作为输入参数的UpdateProduct()重载方法。
图5:
在UPDATE标签里选择重载的UpdateProduct()方法
最后,在INSERT和DELETE标签里选择“(None)”,点完成按钮。
一旦完成“设置数据源向导”,VisualStudio会将ObjectDataSource控件的OldValuesParameterFormatString属性设置为original_{0}。
就像在前面的教程之16章《概述插入、更新和删除数据》里探讨的一样,该属性要么删除掉,要么设置为{0},不然的话更新操作会报错。
此外,完成向导后,VisualStudio会将产品的所有数据列添加到GridView控件,将除了ProductName,CategoryName和UnitPrice之外的所有绑定列(BoundFields)删除。
然后,分别将上述3列的HeaderText属性改为Product”,“Category”和“Price”。
由于ProductName是必需的,将ProductName列转变成模板列(TemplateField),在EditItemTemplate里添加一个RequiredFieldValidator控件;
同样的,将UnitPrice列也转换成模板列,并添加一个CompareValidator控件,确保用户输入的是大于或等于0的有效的货币值。
除此以外,你还可以作一些界面上的改进,比如使UnitPrice值居中,或分别对UnitPrice的只读和编辑界面作一些格式化的处理。
在GridView的智能标签里点相关项启动编辑、分页、排序功能。
注意:
想回顾怎样自定义GridView的编辑界面吗?
请参考前面的文章之20《定制数据修改界面》
图6:
启用GridView的编辑、排序、分页功能。
完成GridView的修改后,GridView和ObjectDataSource的代码声明看起来像下面这样:
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
asp:
GridViewID="
Products"
runat="
server"
AutoGenerateColumns="
False"
DataKeyNames="
ProductID"
DataSourceID="
ProductsDataSo