分类:
2008-11-11 15:57:21
在这段代码里,我们配置了两个缓存让EHCache进行管理。
表5.8 EHCache的缓存配置属性
属 性 |
用 于 指 定 |
diskExpiryThreadIntervalSeconds |
磁盘过期线程运行的频率(以秒为单位),也就是磁盘存留 |
diskPersistent |
磁盘缓存在VM重新启动时是否保持(默认为false)。 |
eternal |
元素是否永恒。如果是永恒的,就永远不会过期(必须设置)。 |
maxElementsInMemory |
内存能够被缓存的最大元素数量(必须设置)。 |
memoryStoreEvictionPolicy |
当达到maxElementsInMemory时,如何强制进行驱逐。 |
name |
缓存的名称。(对于 |
overflowToDisk |
当内存缓存达到maxElementsInMemory时,是否可以溢出 |
timeToIdleSeconds |
导致元素过期的访问间隔(以秒为单位)。设置为0表示元 |
timeToLiveSeconds |
元素在缓存里可以存在的时间(以秒为单位)。设置为0 |
对于RoadRantz程序,我们配置了一个默认缓存(这是EHCache要求的),还配置了一个名为rantzCache的缓存作为主缓存。两个缓存都设置为最多可以容纳500个元素(不过期),访问频率最低的元素会被踢出,不允许磁盘溢出 。
在Spring程序上下文里配置的EHCache之后,就可以声明哪个Bean和方法应该对结果进行缓存。首先,我们来声明一个代理来缓存RoadRantz DAO层里方法的返回值。
我们已经知道HibernateRantDao里的getRantsForDay()方法很适合进行缓存。再回到Spring上下文定义,我们要使用
refId="rantDaoTarget">
methodName="getRantsForDay"
cacheName="rantzCache" />
:proxy>
我们可以根据需要在
methodName="getRantsForDay"
cacheName="rantzCache" />
把数据放到缓存里只完成了一半的工作。在经过一段时间之后,缓存里一定会包含大量数据,其中很多已经没有意义了。最后,这些数据应该被清出缓存,数据缓存周期重新开始。下面我们来看一看如何在方法调用时刷新缓存。
把when属性设置为before可以让缓存在saveRant()被调用之前清空。
声明一个被代理的内部Bean
注意
如果觉得id/refId组合有些奇怪,我们还可以把目标Bean声明为
refId="rantDaoTarget">
<bean class=”com.roadrantz.dao.HibernateRantDao”>
Ref=”sessionFactory”>
methodName="getRantsForDay"
cacheName="rantzCache" />
:proxy>
即使使用了内部Bean,我们仍然需要为每个要代理的Bean声明一个
如果对内部Bean的方法仍然感到不快,或是需要代理多个要缓存的Bean,我们可以考虑使用Spring Modules对注解声明缓存的支持。接下来,让我们忘记
除了前面介绍的基于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的缓存关联起来,这样一来,任何modelId是rantzCacheModel的@Cacheable都会使用名为rantzCache的缓存。