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:缓冲中的最大元素数量。

NameCache Manage的名字,可以常见多个Cache Manage,以使用不同的缓冲策略。

NumberToRemoveWhenScavenging:一次移除的数量。

其中24两个参数,我会在进阶篇中介绍清除时重点讲一下。

 

3.我们再创建一个基于隔离缓冲Isolated Storage

 

4.最后同样别忘了拷贝目录。

1copy "$(ProjectDir)\*.config" "$(TargetDir)"

5.添加引用。

1using Microsoft.Practices.EnterpriseLibrary.Caching;
2using Microsoft.Practices.EnterpriseLibrary.Caching.Expirations;
3using Microsoft.Practices.EnterpriseLibrary.Data;

6.添加缓存项。

 1///先从数据库中读取数据,放在了DataReader中
 2            Database db = DatabaseFactory.CreateDatabase("Database Instance");
 3            IDataReader dr = db.ExecuteReader(CommandType.Text,"Select * from Products");
 4
 5            this.myDr=dr;
 6            
 7            ///创建CacheManager
 8            CacheManager myCacheManager = CacheFactory.GetCacheManager();
 9
10            ///添加缓存项
11            ///默认清除优先级:Normal
12            ///默认过期设置:No Expiration
13            ///注意:这里增加的条目的Key为MyDataReader,如果再增加一个同样Key的条目时,会覆盖第一个

14            myCacheManager.Add("MyDataReader",this.myDr);

7.读取缓存项。

在读取一个缓存项的时候,我们有两点要特别注意:

1)在读取时类型一定要正确,因为在加入缓冲项时类型是由我们自己定的,所以读取时的类型我们自己也知道;

2)在读取时一定要检查是否为空值,切记!

 1///类型一定要正确
 2            IDataReader toBeDisplay = (IDataReader)myCacheManager.GetData("MyDataReader");
 3            
 4            ///要判断是否为空
 5            if(toBeDisplay != null)
 6            {
 7                while(toBeDisplay.Read())
 8                {
 9                    this.listBox.Items.Add(toBeDisplay.GetValue(2));
10                }

11            }

8.移除缓存条目:

利用Remove()方法

1///移除条目
2            myCacheManager.Remove("FileKey");

结束语:关于缓存应用程序块的入门篇介绍就到这里,希望初学的朋友有所帮助。在进阶篇中会介绍基于时间的过期策略和基于提醒机制的过期策略;缓冲存储的加密;条目的移除;装载缓冲;刷新缓冲等内容,希望大家关注。

 

作者:TerryLee
出处:http://terrylee.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted @ 2005-11-11 10:09 TerryLee 阅读(5887) 评论(22)  编辑 收藏 网摘 所属分类: [10]  模式与实践

  回复  引用  查看    
#1楼 2005-11-11 11:22 |       
“我写本系列随笔时就是立足于初学者,帮助初学者,希望能够给他们一些帮助。”
园里的一位师兄说过“态度决定高度”,支持,支持! 关注!
  回复  引用  查看    
#2楼 [楼主]2005-11-11 11:28 | Terrylee      
@杰

谢谢一直以来的支持

^_^

  回复  引用    
#3楼 2005-11-12 07:56 | 玻璃*杯 [未注册用户]
一直很喜欢这样的系列专栏,也一直在关注这个系列.
有一个问题想请教一下Terrylee ,按照你的文章我每个几乎都试验了一遍,
这样发现几乎每个block都产生一个config文件,不知道能不能把他们配置到一个
config文件中.
再次感谢楼主的好文章.

  回复  引用  查看    
#4楼 [楼主]2005-11-12 10:16 | Terrylee      
@玻璃*杯

非常感谢你对本系列随笔的关注

每个应用程序块都有一个自己的config文件,是由配置工具自动生成的

我没尝试过把这些文件合并在一起

你可以手动在App.config或Web.config中把记录这些config文件的地方,改为同一个
文件名,然后再进行配置,尝试一下:)

  回复  引用  查看    
#5楼 2005-12-09 10:45 | 栖息的熊      
有一点不太明白,IDataReader dr = db.ExecuteReader(CommandType.Text,"Select * from Products");
返回的是什么类型的DataReader,好像我这边是SqlDataReader,这个不支持序列化,我换成DataSet就好了。我想知道别的方法。
  回复  引用  查看    
#6楼 [楼主]2005-12-09 13:00 | Terrylee      

@栖息的熊

SqlDataReader不行,所以这里用了IDataReader这个类型。

关于IDataReader的解释:

public abstract interface IDataReader : System.IDisposable, System.Data.IDataRecord

System.Data 的成员

摘要:
 提供一种方法来读取一个或多个通过在数据源执行命令所获得的只进结果集流,这是由访问关系数据库的 .NET Framework 数据提供程序实现的。 


  回复  引用  查看    
#7楼 2005-12-09 17:03 | 栖息的熊      
关键问题是db.ExecuteReader(),返回的对象是一个SqlDataReader.
  回复  引用  查看    
#8楼 2005-12-09 17:05 | 栖息的熊      
还有一个弱问题,partition name是什么意思,有什么作用。
  回复  引用  查看    
#9楼 [楼主]2005-12-12 09:29 | Terrylee      
@栖息的熊

返回的SqlDataReader可以用IDataReader对象来接收

“partition name”这个是哪儿的?一般理解需要根据上下文的
  回复  引用    
#10楼 2005-12-28 13:46 | i2key.com [未注册用户]
我使用EnterpriseLibrary中的缓存模块,现在有下问题,请各位帮忙解答:

我新建了一个CacheManager(比如name为:HighCacheManager),
然后使用CacheManager myCacheManager = CacheFactory.GetCacheManager("HighCacheManager");实例化,

我现在想知道myCacheManager 中所有缓存的名字

比如:myCacheManager.Add("MyDataReader",this.myDr);这里的名字是MyDataReader,
myCacheManager.Add("MyDataReader1",this.myDr);,这里的名字是MyDataReader1,有什么方法能将未过期的缓存名字全部获得

谢谢
  回复  引用  查看    
#11楼 2006-03-29 23:00 | ccs      
@Terrylee
“partition name”这个是哪儿的?一般理解需要根据上下文的"
什么意思?不是很明白,请指教

  回复  引用  查看    
#12楼 2007-11-28 17:25 | RyanYu      
明了,关注中,学习中
  回复  引用  查看    
#13楼 2008-02-11 16:50 | 兰亭      
不知这个IDataReader存入缓存后,是否需要关闭?
  回复  引用    
#14楼 2008-06-12 11:44 | 秋蕾 [未注册用户]
“/WEB”应用程序中的服务器错误。
--------------------------------------------------------------------------------

The type 'Microsoft.Practices.EnterpriseLibrary.Caching.Database.DataBackingStore, Microsoft.Practices.EnterpriseLibrary.Caching.Database, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' cannot be resolved. Please verify the spelling is correct or that the full type name is provided.
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.ArgumentException: The type 'Microsoft.Practices.EnterpriseLibrary.Caching.Database.DataBackingStore, Microsoft.Practices.EnterpriseLibrary.Caching.Database, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' cannot be resolved. Please verify the spelling is correct or that the full type name is provided.

源错误:


行 17: Database db = DatabaseFactory.CreateDatabase("ConnectionString");
行 18: ///创建CacheManager
行 19: CacheManager myCacheManager = (CacheManager)CacheFactory.GetCacheManager();
行 20:
行 21: /// <summary>

这是怎么回事啊?




标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2005-11-11 10:55 编辑过
Google站内搜索

相关文章:

相关链接: