`

Ehcache 整合 Spring 缓存对象

阅读更多

 

@Repository
public interface UserMapper {

public abstract List<User> select();

}

 

 

static void testEhcache3(UserService userService){
  testPage(userService);
  
  userService.findUsers();
  
  testPage(userService);// ����sql
  userService.findUsers(); //使用了缓存,没有打印sql
 }

 

MethodCacheInterceptor的invoke方法没有执行
 切点表达式错误
 <value>cn.mapper.UserMapper.find*</value>
 10:04:50,687 INFO  cn.web.interceptor.MethodCacheInterceptor - com.sun.proxy.$Proxy23.select使用缓存:mobileCache

 

<!-- Ehcache与spring整合 -->
 <bean id="ehCacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" p:shared="true">
  <property name="configLocation" value="classpath:ehcache.xml" />
 </bean>

 

<!-- 这里的方法拦截器主要是对你要拦截的类的方法进行拦截,然后判断该方法的类路径+方法名称+参数值组合的cache key在缓存cache中是否存在。如果存在就从缓存中取出该对象,转换成我们要的返回类型。没有的话就把该方法返回的对象添加到缓存中即可。值得主意的是当前方法的参数和返回值的对象类型需要序列化。-->
 
 <!-- 配置一个简单的缓存工厂bean对象 -->
 <bean id="simpleCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
  <property name="cacheManager" ref="ehCacheManager" />
  <!-- 使用缓存 关联ehcache.xml中的缓存配置 -->
  <property name="cacheName" value="mobileCache" />
 </bean>
 
 <!-- 配置一个缓存拦截器对象,处理具体的缓存业务 -->
 <bean id="methodCacheInterceptor" class="cn.web.interceptor.MethodCacheInterceptor">
  <property name="cache" ref="simpleCache"/>
 </bean>
 
 <!-- 参与缓存的切入点对象 (切入点对象,确定何时何地调用拦截器) -->
 <bean id="methodCachePointCut" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
  <!-- 配置缓存aop切面 -->
  <property name="advice" ref="methodCacheInterceptor" />
  <!-- 配置哪些方法参与缓存策略 -->
  <!--          .表示符合任何单一字元                          ###  +表示符合前一个字元一次或多次                          ###  *表示符合前一个字元零次或多次                          ###  \Escape任何Regular expression使用到的符号                      -->
  <!-- .*表示前面的前缀(包括包名) 表示print方法-->
  <property name="patterns">
   <list>
<!--     <value>cn.service.impl.*UserService*\.*find*</value> -->
<!--     <value>cn.service.impl.*UserService*\.*select.*</value> -->
     <value>cn.mapper.UserMapper.find*</value>
     <value>cn.mapper.UserMapper.select*</value>
     <value>cn.mapper.UserMapper.count</value>
   </list>
  </property>
 </bean>

 

在ehcache.xml中添加如下cache配置

<cache name="mobileCache"       
maxElementsInMemory="10000"       
eternal="false"       
overflowToDisk="true"       
timeToIdleSeconds="1800"       
timeToLiveSeconds="3600"       
memoryStoreEvictionPolicy="LFU" />

 

 

import java.io.Serializable;

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

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;

/**
 * 缓存方法拦截器<br>
 * 参考地址:http://www.cnblogs.com/hoojo/archive/2012/07/12/2587556.html
 */
public class MethodCacheInterceptor implements MethodInterceptor,
  InitializingBean {

 private Logger log = LoggerFactory.getLogger(MethodCacheInterceptor.class);

 private Cache cache;

 public MethodCacheInterceptor() {
  super();
 }

 public void setCache(Cache cache) {
  this.cache = cache;
 }

 /**
  * 拦截Service/DAO的方法,并查找该结果是否存在,如果存在就返回cache中的值,<br>
  * 否则,返回数据库查询结果,并将查询结果放入cache
  */
 public Object invoke(MethodInvocation invocation) throws Throwable {
  // 这个表示哪个类调用(或触发)了这个MethodCacheInterceptor。例如:com.cache.service.UserServiceImpl
  String targetName = invocation.getThis().getClass().getName();
  // 这个表示哪个方法触发了这个类(MethodCacheInterceptor)方法(invoke)的调用,例如:getAllUser
  String methodName = invocation.getMethod().getName();
  // 方法调用的参数
  Object[] arguments = invocation.getArguments();
  Object result;

  String cacheKey = this.getCacheKey(targetName, methodName, arguments);
  Element element = null;
  synchronized (this) {
   element = cache.get(cacheKey);
   if (element == null) {
    log.info(cacheKey + "加入到缓存:" + cache.getName());
    // 调用实际的方法
    result = invocation.proceed();
    element = new Element(cacheKey, (Serializable) result);
    cache.put(element);//放入cache中
   } else {
    log.info(cacheKey + "使用缓存:" + cache.getName());
   }
  }
  log.info("*************************interceptor*************");
  return element.getObjectValue();
 }

 /**
  * 返回具体的方法全路径名称、参数<br>
  * cache key包括包名+类名+方法名,例如:com.cache.service.UserServiceImpl.getAllUser
  *
  * @param targetName
  *            全路径
  * @param methodName
  *            方法名称
  * @param arguments
  *            参数
  * @return 完整方法名称
  */
 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();
 }

 public void afterPropertiesSet() throws Exception {
  if (null == cache) {
   throw new IllegalArgumentException("Cache should not be null.");
  }
 }

}

分享到:
评论

相关推荐

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

    ### Ehcache 整合Spring 使用页面、对象缓存 #### 一、Ehcache简介与特点 Ehcache是一款开源的、高性能的Java缓存框架,它可以用来存储、检索短期数据,以减轻数据库的压力,提高应用程序性能。Ehcache不仅支持...

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

    1. 引入依赖:在项目中添加Ehcache和Spring缓存管理的相关依赖,通常是ehcache-core或ehcache-spring-annotations等。 2. 配置Ehcache:创建一个`ehcache.xml`配置文件,定义缓存策略,包括缓存的名称、大小、过期...

    ehcache+spring demo 整合

    将 Ehcache 整合到 Spring 中,可以方便地在Spring应用中使用缓存服务。 在"ehcache+spring demo 整合"项目中,我们有两个工程:一个Web工程和一个Java工程。Web工程通常用于构建前端展示和处理HTTP请求,而Java...

    Ehcache缓存框架整合Spring和shiro权限配置

    缓存可以提高查询数据性能, 对同一批数据进行多次查询时, 第一次查询走数据库, 查询数据后,将数据保存在内存中,第二次以后查询 可以直接从内存获取数据,而不需要 和数据库进行交互。

    Spring4 整合EhCache实现 页面缓存 零配置

    在本文中,我们将深入探讨如何使用Spring4框架与EhCache进行整合,以实现零配置的页面缓存功能。EhCache是一个广泛使用的开源Java缓存解决方案,它提供了高效的内存和磁盘缓存机制,有助于提升应用程序性能。通过...

    整合spring 和ehcache

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

    spring + ehcache + redis两级缓存

    当我们谈论“Spring + Ehcache + Redis”两级缓存时,我们实际上是在讨论如何在Java环境中利用Spring框架来集成Ehcache作为本地缓存,并利用Redis作为分布式二级缓存,构建一个高效且可扩展的缓存解决方案。...

    springMVC+mybatis+ehcache整合

    总的来说,"springMVC+mybatis+ehcache整合"项目提供了从Web交互到数据库操作再到数据缓存的一站式解决方案。理解并掌握这三个技术的集成,对于开发高效、可维护的Java Web应用具有重要意义。通过下载提供的项目,...

    SpringBoot 集成Ehcache实现缓存

    ### Spring Boot集成Ehcache实现缓存 #### 一、Ehcache简介 Ehcache是一个高效的纯Java进程内缓存框架,以其快速且轻便的特点而被广泛应用于各种应用场景中,尤其在Java EE和轻量级容器环境中更是受到青睐。...

    spring struts2 hibernate ehcache整合

    这篇博客“spring struts2 hibernate ehcache整合”显然探讨了如何将这四个组件集成到同一个项目中,以提升应用程序的性能和效率。以下是关于这些技术及其整合的关键知识点的详细说明: 1. **Spring框架**:Spring...

    Spring+Hibernate+ehcache整合

    在"Spring+Hibernate+ehcache整合"项目中,开发者已经完成了一个将这三个框架集成的基础工程。虽然Struts没有被明确提及,但通常在Web开发中,Spring与Struts结合可以构建更完整的MVC架构。这个整合项目可能包含以下...

    Struts2+Spring+Hibernate+Ehcache+AJAX+JQuery+Oracle 框架集成用户登录注册Demo工程

    1.通过google ehcache-spring-annotatios.jar自动注解方式实现整合Spring+Ehcache。 2.Action里通过struts2-spring-plugin.jar插件自动根据名字注入。 3.Ajax无刷新异步调用Struts2,返回Json数据,以用户注册为例。...

    spring+ibatis+ehcache整合例子

    这个"spring+ibatis+ehcache整合例子"是一个完整的示例项目,展示了如何将这三个框架无缝集成到一个基于MySQL数据库的应用中。下面将详细介绍这三个框架及其整合的关键点。 **Spring框架** Spring是一个全面的企业...

    cglib-2.2.jar,ehcache-spring-annotations-1.1.2.jar

    在这个场景中,`cglib-2.2.jar`和`ehcache-spring-annotations-1.1.2.jar`是两个关键的库文件,它们在实现Spring缓存机制中扮演着重要角色。 **CGLIB(Code Generation Library)** 是一个强大的高性能的代码生成库...

    BoneCP连接池和Ehcache注解缓存整合到Spring

    4. **整合缓存**:使用Spring的AOP(面向切面编程)和Ehcache的注解,在需要缓存的方法上添加`@Cacheable`,在清除缓存的方法上添加`@CacheEvict`。 5. **测试验证**:编写测试用例,确保 BoneCP 能够正常提供数据库...

    ehcache-spring

    Ehcache-spring是将Ehcache缓存框架与Spring框架进行整合的应用。通过Spring AOP(面向切面编程)和Ehcache的结合使用,可以在Spring管理的应用中轻松实现数据缓存,提升应用性能。 首先,Ehcache是一个广泛使用的...

    SpringAOP结合ehCache实现简单缓存实例

    接下来,我们将讨论如何整合Spring AOP和EhCache来创建一个简单的缓存实例: 1. **引入依赖**:首先,你需要在项目的pom.xml文件中添加Spring AOP和EhCache的相关依赖。确保引入最新版本的Spring Framework和...

    spring整合ehcache的完整用例

    Spring整合Ehcache是将Ehcache作为Spring应用的缓存解决方案,以提高应用程序的性能和效率。Ehcache是一个广泛使用的开源Java分布式缓存,它支持内存和磁盘存储,具有缓存热备、缓存复制等功能。下面将详细介绍...

Global site tag (gtag.js) - Google Analytics