Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1967096
  • 博文数量: 606
  • 博客积分: 9991
  • 博客等级: 中将
  • 技术积分: 5725
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-17 19:07
文章分类

全部博文(606)

文章存档

2011年(10)

2010年(67)

2009年(155)

2008年(386)

分类:

2008-11-11 15:57:21

在这段代码里,我们配置了两个缓存让EHCache进行管理。元素是必须有的,描述了在没有找到其他缓存情况下所使用的缓存。元素定义了另一个缓存,可以在ehcache.xml里出现0次或多次(每次针对定义的一个缓存)。在此,我们只定义了rantzCache作为惟一的非默认缓存。

里指定的属性描述了缓存的行为。表5.8列出在配置EHCache缓存时可以使用的属性。

5.8 EHCache的缓存配置属性

   

diskExpiryThreadIntervalSeconds

磁盘过期线程运行的频率(以秒为单位),也就是磁盘存留
的缓存清理过期项目的频率(默认是120秒)。

diskPersistent

磁盘缓存在VM重新启动时是否保持(默认为false)。

eternal

元素是否永恒。如果是永恒的,就永远不会过期(必须设置)。

maxElementsInMemory

内存能够被缓存的最大元素数量(必须设置)。

memoryStoreEvictionPolicy

当达到maxElementsInMemory时,如何强制进行驱逐。
默认使用“最近使用(LRU)”策略,还可以使用“先入先出
FIFO)”和“较少使用(LFU)”策略。(默认是LRU。)

name

缓存的名称。(对于必须设置。)

overflowToDisk

当内存缓存达到maxElementsInMemory时,是否可以溢出
到磁盘。(必须设置。)

timeToIdleSeconds

导致元素过期的访问间隔(以秒为单位)。设置为0表示元
素可以永远空闲。(默认值是0。)

timeToLiveSeconds

元素在缓存里可以存在的时间(以秒为单位)。设置为0
表示元素可以在缓存里永远存在而不过期。(默认值是0。)

对于RoadRantz程序,我们配置了一个默认缓存(这是EHCache要求的),还配置了一个名为rantzCache的缓存作为主缓存。两个缓存都设置为最多可以容纳500个元素(不过期),访问频率最低的元素会被踢出,不允许磁盘溢出

Spring程序上下文里配置的EHCache之后,就可以声明哪个Bean和方法应该对结果进行缓存。首先,我们来声明一个代理来缓存RoadRantz DAO层里方法的返回值。

5.7.2  缓存的代理Bean

我们已经知道HibernateRantDao里的getRantsForDay()方法很适合进行缓存。再回到Spring上下文定义,我们要使用元素把一个代理包裹到HibernateRantDao,从而缓存从getRantsForDay()返回的全部内容:

  :proxy id="rantDao"

      refId="rantDaoTarget">

    :caching

        methodName="getRantsForDay"

        cacheName="rantzCache" />

  :proxy>

元素声明哪个方法要被拦截、其返回值要保存到哪个缓存。本例中,methodName被设置为getRantsForDay(),要使用的缓存是rantzCache

我们可以根据需要在里声明多个来描述Bean方法的缓存。我们可以让一个用于所有被缓存的方法,也可以使用通配符为一个元素指定多个方法。比如下面的元素会代理缓存全部名称由get开头的方法:

:caching

        methodName="getRantsForDay"

        cacheName="rantzCache" />

把数据放到缓存里只完成了一半的工作。在经过一段时间之后,缓存里一定会包含大量数据,其中很多已经没有意义了。最后,这些数据应该被清出缓存,数据缓存周期重新开始。下面我们来看一看如何在方法调用时刷新缓存。

when属性设置为before可以让缓存在saveRant()被调用之前清空。

声明一个被代理的内部Bean

注意idrefId属性。由生成的代理的idrantDao,然而这是HibernateRantDao Beanid,因此,我们需要把这个真正的Bean重命名为rantDaoTarget(由refId属性指定)。(这与传统Spring AOP代理及其目标的命名方式是一样的,详情请见4.2.3小节。)

如果觉得id/refId组合有些奇怪,我们还可以把目标Bean声明为的内部Bean。举例来说,下面就是把HibernateRantDao配置为一个内部Bean

  :proxy id="rantDao"

      refId="rantDaoTarget">

   

   <bean class=”com.roadrantz.dao.HibernateRantDao”>

     

Ref=”sessionFactory”>

    :caching

        methodName="getRantsForDay"

        cacheName="rantzCache" />

  :proxy>

即使使用了内部Bean,我们仍然需要为每个要代理的Bean声明一个元素,为方法声明一个或多个元素。对于简单程序来说,这样做不会有什么问题,但随着代理缓存Bean和方法的数量不断增加,这将意味着Spring配置里越来越多的XML

如果对内部Bean的方法仍然感到不快,或是需要代理多个要缓存的Bean,我们可以考虑使用Spring Modules对注解声明缓存的支持。接下来,让我们忘记,看一看Spring Modules如何支持注解驱动的缓存。

5.7.3  注解驱动的缓存

除了前面介绍的基于XML的缓存配置,Spring Modules还支持使用代码级元数据声明缓存。这种支持有两种形式:

Java 5注解:如果目标环境是Java 5平台,这就是很理想的解决方案。

Jakarta公共属性:如果目标环境是Java 5以前的平台,就应该选择它。
对于RoadRantz程序来说,其目标环境是Java 5,所以我们要使用Java 5注解来声明DAO层的缓存。对于缓存,Spring Modules提供了两个注解:

@Cacheable:声明一个方法的返回值应该被缓存。

@CacheFlush:声明一个方法是清空缓存的触发器。

利用@Cacheable注解,我们可以像下面这样把getRantsForDay()声明为要被缓存的:

modelId属性指定用于缓存方法返回值的模型,稍后我们介绍说明如何定义缓存模型,现在先来看一看如何使用@CacheFlush来指定saveRant()被调用时的缓存清空操作:

modelId属性指定的刷新模型会在saveRant()方法被调用时被清空。

既然说到缓存模型和刷新模型,那么它们是从何而来的呢?元素被用于启动Spring Modules对注解的支持,我们会在roadrantzcache.xml文件里像下面这样配置它:

  <ehcache:annotations>

    <ehcache:caching id="rantzCacheModel" cacheName="rantzCache" />

  ehcache:annotations> 

在元素里,必须配置至少一个元素,它就定义了一个缓存模型。简单来说,缓存模型基本上就是对ehcache.xml里配置的一个缓存的引用。本例中,我们把rantzCacheModel与名为rantzCache的缓存关联起来,这样一来,任何modelIdrantzCacheModel@Cacheable都会使用名为rantzCache的缓存。

阅读(869) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~