`
jiagyao
  • 浏览: 99264 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

利用 Spring 和 EHCache 缓存结果(转)

阅读更多
导言

从 Spring 1.1.1 开始,EHCache 就作为一种通用缓存解决方案集成进 Spring。

我将示范拦截器的例子,它能把方法返回的结果缓存起来。

利用 Spring IoC 配置 EHCache

在 Spring 里配置 EHCache 很简单。你只需一个 ehcache.xml 文件,该文件用于配置 EHCache:

< ehcache > 
 
     <! —设置缓存文件 .data 的创建路径。

         如果该路径是 Java 系统参数,当前虚拟机会重新赋值。

         下面的参数这样解释:
         user.home – 用户主目录
         user.dir      – 用户当前工作目录
         java.io.tmpdir – 默认临时文件路径  -->

    < diskStore path = " java.io.tmpdir " />
 
 
     <! —缺省缓存配置。CacheManager 会把这些配置应用到程序中。

        下列属性是 defaultCache 必须的:

        maxInMemory      -  设定内存中创建对象的最大值。
        eternal   -  设置元素(译注:内存中对象)是否永久驻留。如果是,将忽略超
                                              时限制且元素永不消亡。
        timeToIdleSeconds   -  设置某个元素消亡前的停顿时间。
                          也就是在一个元素消亡之前,两次访问时间的最大时间间隔值。
                        这只能在元素不是永久驻留时有效(译注:如果对象永恒不灭,则设置该属性也无用)。  如果该值是  0  就意味着元素可以停顿无穷长的时间。
        timeToLiveSeconds  -  为元素设置消亡前的生存时间。也就是一个元素从构建到消亡的最大时间间隔值。
                                               这只能在元素不是永久驻留时有效。
        overflowToDisk         -  设置当内存中缓存达到 maxInMemory 限制时元素是否可写到磁盘
                                               上。
         --> 
 
     < cache name = " org.taha.cache.METHOD_CACHE " 
        maxElementsInMemory = " 300 " 
        eternal = " false " 
        timeToIdleSeconds = " 500 " 
        timeToLiveSeconds = " 500 " 
        overflowToDisk = " true " 
         /> 
 </ ehcache > 


拦截器将使用 ”org.taha.cache.METHOD_CACHE” 区域缓存方法返回结果。下面利用 Spring IoC 让 bean 来访问这一区域。


< bean id = " cacheManager "   class = " org.springframework.cache.ehcache.EhCacheManagerFactoryBean " > 
   < property name = " configLocation " > 
     < value > classpath:ehcache.xml </ value > 
   </ property > 
 </ bean > 
 
 < bean id = " methodCache "   class = " org.springframework.cache.ehcache.EhCacheFactoryBean " > 
   < property name = " cacheManager " > 
     < ref local = " cacheManager " /> 
   </ property > 
   < property name = " cacheName " > 
     < value > org.taha.cache.METHOD_CACHE </ value > 
   </ property > 
 </ bean > 


构建我们的 MethodCacheInterceptor

该拦截器实现org.aopalliance.intercept.MethodInterceptor接口。一旦运行起来(kicks-in),它首先检查被拦截方法是否被配置为可缓存的。这将可选择性的配置想要缓存的 bean 方法。只要调用的方法配置为可缓存,拦截器将为该方法生成 cache key 并检查该方法返回的结果是否已缓存。如果已缓存,就返回缓存的结果,否则再次调用被拦截方法,并缓存结果供下次调用。

org.taha.interceptor.MethodCacheInterceptor
package  org.taha.interceptor;

 import  java.io.Serializable;

 import  org.aopalliance.intercept.MethodInterceptor;
 import  org.aopalliance.intercept.MethodInvocation;

 import  org.apache.commons.logging.LogFactory;
 import  org.apache.commons.logging.Log;

 import  org.springframework.beans.factory.InitializingBean;
 import  org.springframework.util.Assert;

 import  net.sf.ehcache.Cache;
 import  net.sf.ehcache.Element;

 /** */ /** 
 *  @author  <a href="Omar''''>mailto:irbouh@gmail.com">Omar Irbouh</a>
 *  @since  2004.10.07
  */ 
  public   class  MethodCacheInterceptor  implements  MethodInterceptor, InitializingBean   {
   private   static   final  Log logger  =  LogFactory.getLog(MethodCacheInterceptor. class );

   private  Cache cache;

   /** */ /** 
   * 设置缓存名
    */ 
    public   void  setCache(Cache cache)   {
     this .cache  =  cache;
  } 
 
    /** */ /** 
   * 检查是否提供必要参数。
    */ 
    public   void  afterPropertiesSet()  throws  Exception   {
    Assert.notNull(cache,  " A cache is required. Use setCache(Cache) to provide one. " );
  } 
 
    /** */ /** 
   * 主方法
   * 如果某方法可被缓存就缓存其结果
   * 方法结果必须是可序列化的(serializable)
    */ 
    public  Object invoke(MethodInvocation invocation)  throws  Throwable   {
    String targetName   =  invocation.getThis().getClass().getName();
    String methodName   =  invocation.getMethod().getName();
    Object[] arguments  =  invocation.getArguments();
    Object result;

    logger.debug( " looking for method result in cache " );
    String cacheKey  =  getCacheKey(targetName, methodName, arguments);
    Element element  =  cache.get(cacheKey);
     if  (element  ==   null )   {
       // call target/sub-interceptor 
       logger.debug( " calling intercepted method " );
      result  =  invocation.proceed();

       // cache method result 
       logger.debug( " caching result " );
      element  =   new  Element(cacheKey, (Serializable) result);
      cache.put(element);
    } 
     return  element.getValue();
  } 
 
    /** */ /** 
   * creates cache key: targetName.methodName.argument0.argument1
    */ 
   private  String getCacheKey(String targetName,
                             String methodName,
                             Object[] arguments)   {
    StringBuffer sb  =   new  StringBuffer();
    sb.append(targetName)
      .append( " . " ).append(methodName);
     if  ((arguments  !=   null )  &&  (arguments.length  !=   0 ))   {
       for  ( int  i = 0 ; i < arguments.length; i ++ )   {
        sb.append( " . " )
          .append(arguments[i]);
      } 
    } 
 
     return  sb.toString();
  } 
} 


MethodCacheInterceptor 代码说明了:

默认条件下,所有方法返回结果都被缓存了(methodNames 是 null)
缓存区利用 IoC 形成
cacheKey 的生成还包括方法参数的因素(译注:参数的改变会影响 cacheKey)
使用 MethodCacheInterceptor

下面摘录了怎样配置 MethodCacheInterceptor:
< bean id = " methodCacheInterceptor "   class = " org.taha.interceptor.MethodCacheInterceptor " > 
   < property name = " cache " > 
     < ref local = " methodCache "   /> 
   </ property > 
 </ bean > 
 
 < bean id = " methodCachePointCut "   class = " org.springframework.aop.support.RegexpMethodPointcutAdvisor " > 
   < property name = " advice " > 
     < ref local = " methodCacheInterceptor " /> 
   </ property > 
   < property name = " patterns " > 
     < list > 
       < value > . * methodOne </ value > 
       < value > . * methodTwo </ value > 
     </ list > 
   </ property > 
 </ bean > 
 
 < bean id = " myBean "   class = " org.springframework.aop.framework.ProxyFactoryBean " > 
   < property name = " target " > 
    < bean  class = " org.taha.beans.MyBean " /> 
   </ property > 
   < property name = " interceptorNames " > 
     < list > 
       < value > methodCachePointCut </ value > 
     </ list > 
   </ property > 
 </ bean > 


译注

夏昕所著《Hibernate 开发指南》,其中他这样描述 EHCache 配置文件的:
 < ehcache > 
     < diskStore path = " java.io.tmpdir " /> 
     < defaultCache
        maxElementsInMemory = " 10000 " // Cache中最大允许保存的数据数量 
         eternal = " false "                     // Cache中数据是否为常量 
         timeToIdleSeconds = " 120 "       // 缓存数据钝化时间 
         timeToLiveSeconds = " 120 "       // 缓存数据的生存时间 
         overflowToDisk = " true "         // 内存不足时,是否启用磁盘缓存 
      /> 
 </ ehcache > 
分享到:
评论

相关推荐

    Spring+EhCache缓存实例

    **Spring+EhCache缓存实例详解** 在现代的Java企业级应用中,缓存技术扮演着至关重要的角色,它能够显著提升系统性能,减少数据库负载。Spring框架与EhCache的结合,为开发者提供了一种高效、易用的缓存解决方案。...

    Spring 与Ehcache实现基于方法的缓存

    本篇文章将详细探讨如何在Spring框架中集成并实现基于方法的缓存机制,利用Ehcache来优化数据访问。 首先,我们需要理解Spring的AOP概念,AOP允许我们定义横切关注点,如日志、事务管理或,正如在这个案例中,缓存...

    spring + ehcache + redis两级缓存

    4. **代码中使用缓存**: 在业务代码中,我们可以使用Spring的`@Cacheable`、`@CacheEvict`和`@CachePut`注解来声明方法的返回结果应被缓存,清除特定缓存项,或者在更新数据后更新缓存。 5. **监控与维护**: 最后,...

    Spring AOP+ehCache简单缓存系统解决方案

    在本篇【Spring AOP+ehCache简单缓存系统解决方案】中,我们将探讨如何利用Spring AOP(面向切面编程)和ehCache框架来构建一个高效、简单的缓存系统,以提升应用程序的性能。ehCache是一款流行的开源Java缓存库,它...

    Spring+Ehcache集成

    Ehcache作为一款流行的开源缓存解决方案,因其轻量级、高性能和易于集成的特点,常被广泛应用于Spring框架中。本篇文章将详细介绍如何在Spring项目中集成Ehcache,以及如何通过Spring的AOP(面向切面编程)实现方法...

    Ehcache分布式缓存与其在SpringBoot应用

    Ehcache是一个高性能的、基于Java的进程内缓存解决方案,它被广泛应用于各种Java应用程序,包括Java EE和轻量级容器。Ehcache的主要优势在于它的快速响应、易用性和丰富的缓存策略。它提供了两种级别的缓存存储:...

    整合spring 和ehcache

    配置ehcache缓存,存储内存的设置,与spring 的整合等

    spring-ehcache-redis两级缓存

    (见下图,为了减少get这几条网络传输,我们会在每个应用服务器上增加本地的ehcache缓存作为二级缓存,即第一次get到的数据存入ehcache,后面output输出即可从本地ehcache中获取,不用再访问redis了,所以就减少了...

    spring+ehcache示例整合Demo

    Ehcache通常使用的是`org.ehcache:ehcache`库,而Spring的相关依赖可能包括`spring-context`和`spring-context-support`,以支持缓存管理。 ```xml &lt;groupId&gt;org.springframework &lt;artifactId&gt;spring-context ...

    Ehcache 整合Spring 使用页面、对象缓存

    - **与Spring、Hibernate的集成**:Ehcache可以非常容易地与Spring和Hibernate框架集成,简化缓存的配置和使用。 #### 二、准备工作 在开始使用Ehcache之前,需要先完成以下准备工作: 1. **下载JAR包**: - **...

    Spring Boot的EhCache缓存使用.docx

    在Spring Boot应用中,缓存是提升性能的关键技术之一。默认情况下,Spring Boot的`@EnableCaching`注解...同时,EhCache还支持与其他缓存相关的特性,如二级缓存、分布式缓存等,可以进一步提高系统的性能和可扩展性。

    Spring与ehcache结合使用

    通过上述步骤,我们可以在Spring项目中成功集成ehcache,并利用Spring提供的缓存注解来方便地管理缓存。这种集成不仅可以显著提高应用的性能,还能简化代码的复杂度,使得开发者能够更加专注于业务逻辑的编写。希望...

    Spring Boot 2.x基础教程:使用EhCache缓存集群.docx

    为了解决这个问题,我们需要配置EhCache缓存集群,以确保数据更新能在各个进程中同步。以下是如何使用EhCache实现缓存集群的详细步骤: 首先,确保缓存对象是可序列化的。在上述例子中,`User`实体需要实现`...

    cache/ehcache缓存使用

    本文将详细讲解"cache/ehcache缓存使用"的相关知识点,包括缓存的基本概念、Ehcache的介绍、以及如何在Java应用中使用Ehcache进行缓存操作。 首先,我们要理解什么是缓存。缓存是一种存储技术,它临时存储常用或...

    springboot整合Ehcache组件,轻量级缓存管理

    Ehcache缓存简介 1、基础简介 EhCache是一个纯Java的进程内缓存框架,具有快速、上手简单等特点,是Hibernate中默认的缓存提供方。 2、Hibernate缓存 Hibernate三级缓存机制简介: 一级缓存:基于Session级别分配...

    在Spring+Hibernate集成环境中使用EhCache缓存

    在Spring和Hibernate集成的开发环境中,使用EhCache作为缓存机制是常见的优化策略,它能够显著提升应用程序的性能和响应速度。EhCache是一款开源的、高性能的、内存级的分布式缓存解决方案,适用于Java应用程序。...

    spring+ehcache demo

    【Spring + Ehcache 整合应用详解】 ...通过学习和实践这个示例,开发者可以深入了解Spring与Ehcache的集成,以及如何利用缓存提升应用程序的性能。同时,了解如何管理和配置数据库连接,也是Java开发中的基础技能。

    spring整合EhCache 的简单例子

    Spring 整合 EhCache 是一个常见的缓存管理方案,它允许我们在Spring应用中高效地缓存数据,提高系统性能。EhCache 是一个开源、基于内存的Java缓存库,适用于快速、轻量级的数据存储。现在我们来详细探讨如何在...

Global site tag (gtag.js) - Google Analytics