Enterprise Library Step By Step系列(九):缓冲应用程序块——入门篇

简介:
写在前面:企业库 Step By Step 系列的随笔今天已经是第九篇了,期间得到了很多朋友的支持,他们认为给初学者提供了很好的资料,在这里表示衷心的感谢。也有朋友反映说关于企业库使用的文章网上已经有了很多,希望我能写一些企业库类设计的文章,我也非常感谢这些朋友提出的建议。我写本系列随笔时就是立足于初学者,帮助初学者,希望能够给他们一些帮助。所以本系列随笔我还会继续下去,写完入门篇和进阶篇后,我会写类设计篇,最后我计划再写一篇总结篇的随笔,作为对企业库的一个总结,最后再次谢谢大家的关注和支持。
  一.缓存应用程序块概述:
企业库缓冲应用程序块提供了一些方便易用的,可扩展的缓冲机制,可让开发人员将本地缓存集成到其应用程序中。它支持内存缓存和后备存储(可选),后者可以是企业程序库数据访问应用程序块或独立存储方式(Isolated Storage
)。应用程序块无需修改即可使用,它还可以提供检索、添加和删除缓存数据所需的全部功能。可配置的过期时间与清除策略也是应用程序块的一部分功能。
在构建企业级分布式应用程序时,架构师和开发人员面临着许多难题。缓存可以帮助您克服其中的一些难题,包括:
性能: 通过存储与数据使用者尽可能接近的相关数据,缓存可以提高应用程序的性能。这样可以避免重复进行数据创建、处理和传输。
可伸缩性: 在缓存中存储信息有助于节省资源,并且可以随着应用程序需求的增加来提高可伸缩性
可用性: 通过将数据存储在本地缓存中,应用程序可以承受系统的故障,例如网络等待时间、Web 服务问题以及硬件故障
适用的情况:
1 )必须重复访问静态数据或极少更改的数据
2 )在创建、访问或传输方面,数据访问的开销很高
3 )即使在源(例如服务器)不可用时,数据也必须始终可用
缓冲应用程序块可应用于以下任何一种应用程序类型:
Windows  窗体
控制台
Windows  服务
企业服务
ASP.NET Web  应用程序或 Web 服务
应该将缓存应用程序块部署在单个应用程序域中。每个应用程序域都可以有一个或多个缓存(可以有也可以没有后备存储)。缓存不能在不同的应用程序域之间共享。
缓存应用程序块的性能已优化,并且是线程安全和异常安全的。您可以对它进行扩展,以包括您自己的过期策略和后备存储。
  二.缓冲存储:
缓冲存储分为内存驻留型缓冲和磁盘驻留型缓冲。
1 .内存驻留型缓冲:
内存驻留型缓冲的典型应用:
应用程序经常使用同样的数据
一个应用程序经常需要重新获得数据
2 .磁盘驻留型缓冲:
磁盘驻留型缓冲的典型应用:
数据量比较大
同时,从应用服务提供商(例如数据库)重新获取数据,开销比较大
在缓冲的生命周期中,必须经历系统的重新启动
三.缓冲的典型使用步骤:
在开始介绍使用之前,我们同样认为您已经拥有了一个项目和 App.config 配置文件。
1.运行企业库配置工具,打开项目配置文件(Web.configApp.config),创建一个Cache Application Block
2 .选择Application | Caching Application Block | Cache Managers | Cache Manager,这时我们可以看到几个参数:
ExpirationPollFrequencyInSecond :指过期轮询周期,就是多长时间就检查一下有哪些缓存项过期了,由后台独立进程执行。这个参数很关键,如果时间设置的太短,就会使这个后台进程不断执行,占用大量 CPU 时间,如果太长,又会浪费内存,要找个不长不短的,推荐用性能计数器监测一下,选一个适中的参数。
MaximumElementsLnCacheBeforeScavenging :缓冲中的最大元素数量。
Name Cache Manage 的名字,可以常见多个 Cache Manage ,以使用不同的缓冲策略。
NumberToRemoveWhenScavenging :一次移除的数量。
其中 2 4 两个参数,我会在进阶篇中介绍清除时重点讲一下。
 
3 .我们再创建一个基于隔离缓冲 Isolated Storage
 
4 .最后同样别忘了拷贝目录。
1 None.gif copy  " $(ProjectDir)\*.config "   " $(TargetDir) "
5 .添加引用。
1 None.gif using  Microsoft.Practices.EnterpriseLibrary.Caching;
2 None.gif using  Microsoft.Practices.EnterpriseLibrary.Caching.Expirations;
3 None.gif using  Microsoft.Practices.EnterpriseLibrary.Data;
6 .添加缓存项。
 1 ExpandedBlockStart.gif ///先从数据库中读取数据,放在了DataReader中
 2 None.gif             Database db  =  DatabaseFactory.CreateDatabase( " Database Instance " );
 3 None.gif            IDataReader dr  =  db.ExecuteReader(CommandType.Text, " Select * from Products " );
 4 None.gif
 5 None.gif             this .myDr = dr;
 6 None.gif            
 7 ExpandedBlockStart.gif             ///创建CacheManager
 8 None.gif             CacheManager myCacheManager  =  CacheFactory.GetCacheManager();
 9 None.gif
10 ExpandedBlockStart.gif             ///添加缓存项
11InBlock.gif            ///默认清除优先级:Normal
12InBlock.gif            ///默认过期设置:No Expiration
13ExpandedBlockEnd.gif            ///注意:这里增加的条目的Key为MyDataReader,如果再增加一个同样Key的条目时,会覆盖第一个

14 None.gif             myCacheManager.Add( " MyDataReader " , this .myDr);
7 .读取缓存项。
在读取一个缓存项的时候,我们有两点要特别注意:
1 )在读取时类型一定要正确,因为在加入缓冲项时类型是由我们自己定的,所以读取时的类型我们自己也知道;
2 )在读取时一定要检查是否为空值,切记!
 1 ExpandedBlockStart.gif ///类型一定要正确
 2 None.gif             IDataReader toBeDisplay  =  (IDataReader)myCacheManager.GetData( " MyDataReader " );
 3 None.gif            
 4 ExpandedBlockStart.gif             ///要判断是否为空
 5 None.gif              if (toBeDisplay  !=   null )
 6 ExpandedBlockStart.gif             {
 7InBlock.gif                while(toBeDisplay.Read())
 8ExpandedSubBlockStart.gif                {
 9InBlock.gif                    this.listBox.Items.Add(toBeDisplay.GetValue(2));
10ExpandedSubBlockEnd.gif                }

11ExpandedBlockEnd.gif            }
8 .移除缓存条目:
利用 Remove() 方法
1 ExpandedBlockStart.gif ///移除条目
2 None.gif             myCacheManager.Remove( " FileKey " );
结束语:关于缓存应用程序块的入门篇介绍就到这里,希望初学的朋友有所帮助。在进阶篇中会介绍基于时间的过期策略和基于提醒机制的过期策略;缓冲存储的加密;条目的移除;装载缓冲;刷新缓冲等内容,希望大家关注。


















本文转自lihuijun51CTO博客,原文链接:  http://blog.51cto.com/terrylee/67611 ,如需转载请自行联系原作者


相关文章