Spring 3.1 M1的一项主要特性就是对在Spring项目里透明的使用缓存的通用缓存抽象化支持。就像对事务(transaction)的支持那样,缓存抽象化提供了一系列的缓存解决方案,并且对代码的影响非常小。
目的 缓存被广泛的应用于改善程序的表现方面,因为它透明的对频繁访问的数据提供了一种更时尚的解决方案,比如它在本机内存中取数据而不是在网络上。不管知道与否,大多数人已经使用过缓存:大多数的ORM/JPA框架提供了专用缓存功能(也被称为二级缓存)。Spring 3.1 M1引入了一种能用于任何Java类、方法或者库的通用缓存机制:即可以与已经存在的缓存结合使用,添加缓存接口(比如JDBC),也可以只用于提高一个慢速的、耗时且耗用资源的系统性能。
@Cacheable, @CacheEvict 和 SpEL 我们看看缓存如何应用于一个方法: 通过在方法上添加@Cacheable注解,我们告诉容器findBook方法已经存储在了缓存中的book实体里。这个方法每次被调用的时候,都会在缓存中以传入参数做为key进行查找(本例中为 isbn)。如果找到了对应值,就将其返回,并且跳过方法的执行。但是,如果没有找到对应的值,方法仍然会照常执行并且执行的结果会被存储在缓存中,以便方法的下次调用时直接返回,而不是真正的去执行一遍(昂贵的或者慢的)方法。
在实际应用中,并不是所有方法都只有一个参数,或者更糟糕的情况,参数并不适合当做缓存的key——比如稍微修改一下上面的方法: 在上面的例子里,你可以使用Spring 3 Spring Expression Language 或者 SpEL来选择参数,导航对象树: 或者即时计算,甚至调用任何方法时都不用修改代码: 另外,你可以指定当异常发生时缓存的行为:是对异常进行检查,还是无视异常继续正常执行。这取决于开发者的决策标准:key的大小,或者是时间类型,或者是任意方法的返回值,SpEL对它提供了全面的支持: 通过@CacheEvict注解,缓存抽象化同时也支持清空驱逐缓存条目或者清空整个缓存。为了达到一次清空即使所有缓存失效的效果(例如由于缓存中的数据已经更新)你可以这样做: 注解一旦被写上的话,你就可以只使用一条代码就“允许”缓存功能(如果你算上结构描述的话就是三个):
声明一个缓存实现 到目前为止,我们一直以陈述性的语言讨论缓存的抽象化:在你的POJO中如何添加与移除数据。那么什么才是你能使用的高速缓存实现呢? 目前可以使用的,Spring提供了对ehcache和JDK中ConcurrentHashMap 的整合,非分布式的环境和测试:
关于[xx] 类库,什么时候才能提供支持? 现在我们还不打算在Spring框架内部支持其它缓存,原因荐于以下方面:依赖性、维护和协议。如果想使用自定义缓存,我们鼓励开发者在缓存SPI包中查看两个接口: CacheManager和 Cache。另外你可以在GemFire 查看目前Spring支持的实现,以及下个主要更新中的缓存支持。
缓存抽象化与其它缓存相比怎么样(比如JPA的二级缓存)? 通常来讲,两种缓存机制能愉快的共存,除开发者发现了什么冲突的部分。拿JPA的二级缓存来讲,你可以用它来访问数据并且同时使用Spring的缓存来做为远程网络调用的服务层。如果适合,你可以更进一步的复用两个调整缓存。
总结 我希望你能喜欢这篇简短的介绍Spring3.1新缓存特发的文章。更多信息请查阅相关参考文档章节和SPI文档。请我们知道你的想法——我们期待着你的反馈。你可以来论坛、博客、或者Twitter。
译者的话 话说这是我第一次翻译英文文章啊,不翻译还真不知道自己的英文水平不够用啊。平时自己看能理解大体意思,真翻译起来还真有好多词拿不准哦。如果你发现了什么错误的地方,请在本博客留言,或者联系译者coolcooldool@gmail.com。 【原文地址】http://hi.baidu.com/coolcooldool/blog/item/c1bbb9ec43c3d727269791ec.html |
Spring 3.1 M1: 缓存抽象化
最新推荐文章于 2024-06-18 14:54:47 发布
Spring 3.1 M1: 缓存抽象化
2011-07-21 13:10