这是接上篇<<Ehcache入门>>的进阶篇。
在实际的项目开发中,肯定会根据具体业务,数据大小,复杂度采用不同的技术实现方式,Ehcache在实际项目开发中一般被用来缓存方法结果集,且可以与Spring无缝集成,完全交由Spring——Aop拦截器来完成,我们只需处理好业务数据获取环节。
1.ehcache.xml配置:
<ehcache> <diskStore path="java.io.tmpdir"/> <defaultCache maxElementsInMemory="10000" eternal="false" overflowToDisk="true" timeToIdleSeconds="120" timeToLiveSeconds="120" diskPersistent="false" diskExpiryThreadIntervalSeconds="120"/> <cache name="gov.csc.ems.cache.METHOD_CACHE" maxElementsInMemory="300" eternal="false" timeToIdleSeconds="600" timeToLiveSeconds="600" overflowToDisk="true" /> </ehcache>
2. Spring集成Ehcache配置,cacheManage,methodCache
<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>gov.csc.ems.cache.METHOD_CACHE</value> </property> </bean>
3. 完成上面的基础配置,Spring是靠拦截器来缓存我们的方法,因此建立我们自己的方法拦截器MethodCacheInterceptor。MethodCacheInterceptor实现了org.aopalliance.intercept.MethodInterceptor接口。
import java.io.Serializable; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; import org.springframework.beans.factory.InitializingBean; import org.springframework.util.Assert; import net.sf.ehcache.Cache; import net.sf.ehcache.Element; public class MethodCacheInterceptor implements MethodInterceptor, InitializingBean { private Cache cache; /** * sets cache name to be used */ public void setCache(Cache cache) { this.cache = cache; } /** * Checks if required attributes are provided. */ public void afterPropertiesSet() throws Exception { Assert.notNull(cache, "A cache is required. Use setCache(Cache) to provide one."); } /** * main method caches method result if method is configured for caching * method results must be 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; String cacheKey = getCacheKey(targetName, methodName, arguments); Element element = cache.get(cacheKey); if (element == null) { result = invocation.proceed(); 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(); } }
invoke方法中:
String cacheKey = getCacheKey(targetName, methodName, arguments); Element element = cache.get(cacheKey); if (element == null) { result = invocation.proceed(); element = new Element(cacheKey, (Serializable) result); cache.put(element); } return element.getValue();
这段代码就是用来缓存我们的方法结果,拦截器先用key(key=className + methodName + arguments)查询缓存,缓存中存在则返回,否则调用invocation.proceed(),根据我们自己的实现查询数据,即第一次查询,以后每次就走缓存。
4.Spring中定义拦截器配置:
<bean id="methodCacheInterceptor" class="gov.csc.ems.util.cache.interceptor.MethodCacheInterceptor"> <property name="cache"> <ref local="methodCache" /> </property> </bean>
5.Aop正则表达式的切入点配置:
<bean id="methodCachePointCut" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> <property name="advice"> <ref local="methodCacheInterceptor" /> </property> <property name="patterns"> <list> <value>.*</value> </list> </property> </bean>
patterns要拦截的规则,可以拦截指定的方法,如.getOrg*,.getUser*,这里我拦截所有的方法。
6.交给Spring代理
<bean id="codeCacheBean" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="target"> <bean class="gov.csc.ems.util.cache.CodeCache" /> </property> <property name="interceptorNames"> <list> <value>methodCachePointCut</value> </list> </property> </bean>
其中<bean class="gov.csc.ems.util.cache.CodeCache" />它就是我们缓存的类,缓存就是它里面的所有方法,当我们要用到它里面的方法时,如果此方法配置了缓存拦截,就会先走拦截器。
7.要缓存的方法类CodeCache
public class CodeCache { public CodeCache() { super(); } public Map getOrgCache() { //从数据库查询org ...... } public Map getUserCache() { //从数据库查询user ...... } }
8.测试
我这里写了个servlet,根据Spring获取到CodeCache,
CodeCache codeCache=(CodeCache) BeanUtil.getBean("codeCacheBean"); Map codeBasOrgs=codeCache.getOrgCache(); System.out.println(codeBasOrgs.get("0001"));
分别在拦截器和CodeCache中打上断点,运行发现每次先走拦截器,而且第一次会走CodeCache查询,以后就直接取缓存了。
9.缓存的更新
如新添加了Org或user,CodeCache.getOrgCache.put(key,value)即可添加到缓存。
相关推荐
这篇博客将深入探讨如何将 Ehcache 集成到 Spring 应用中,以及如何使用 Spring AOP 实现计算结果的缓存。 首先,集成 Ehcache 到 Spring 需要以下步骤: 1. **引入依赖**: 在 Maven 或 Gradle 的配置文件中添加 ...
**Spring与Ehcache集成详解** 在现代Java应用开发中,缓存技术是提升系统性能的关键环节。Ehcache作为一款流行的开源缓存解决方案,因其轻量级、高性能和易于集成的特点,常被广泛应用于Spring框架中。本篇文章将...
### Ehcache 整合Spring 使用页面、对象缓存 #### 一、Ehcache简介与特点 Ehcache是一款开源的、高性能的Java...通过上述步骤,您可以轻松地将Ehcache集成到您的Spring项目中,利用其强大的功能来优化您的应用程序。
#### 二、Spring Boot与Ehcache集成 在Spring Boot项目中集成Ehcache可以显著提高系统的响应速度和性能。下面将详细介绍如何在一个Spring Boot项目中集成并使用Ehcache缓存。 ##### 1. 创建项目 首先,使用IDEA...
Ehcache 是一款高效、流行的Java缓存库,它能够帮助...这个项目是学习和理解如何在Spring应用中集成Ehcache的一个好起点,你可以通过运行这两个工程,观察缓存的使用效果,逐步掌握如何在实际项目中利用缓存优化性能。
4. **代码中使用缓存**: 在业务代码中,我们可以使用Spring的`@Cacheable`、`@CacheEvict`和`@CachePut`注解来声明方法的返回结果应被缓存,清除特定缓存项,或者在更新数据后更新缓存。 5. **监控与维护**: 最后,...
1. 引入依赖:在项目中添加Ehcache和Spring缓存管理的相关依赖,通常是ehcache-core或ehcache-spring-annotations等。 2. 配置Ehcache:创建一个`ehcache.xml`配置文件,定义缓存策略,包括缓存的名称、大小、过期...
本篇文章将详细探讨如何在Spring框架中集成并实现基于方法的缓存机制,利用Ehcache来优化数据访问。 首先,我们需要理解Spring的AOP概念,AOP允许我们定义横切关注点,如日志、事务管理或,正如在这个案例中,缓存...
Spring对ehCache的支持使得集成更加简便,我们可以利用Spring的缓存抽象来管理ehCache实例,包括设置缓存策略、大小限制等。 为了实现数据更新时的缓存刷新,我们可以利用Spring的事件驱动模型。当创建、更新或删除...
- 方法级缓存:使用`@Cacheable`注解标记方法,每次调用该方法时,会首先检查缓存中是否有结果,如果有则直接返回,否则执行方法并将结果存入缓存。 - 类级缓存:整个类的所有方法共享同一份缓存,适用于所有方法...
在SpringBoot应用中集成Ehcache,通常需要以下步骤: 1. **环境配置**:首先,你需要在SpringBoot的`pom.xml`文件中添加Ehcache和相关依赖。同时,在`application.properties`或`application.yml`文件中配置Ehcache...
通过Spring4的Java配置方式,我们可以轻松地集成EhCache到我们的项目中,实现对页面整体或局部内容的缓存。 首先,我们需要在项目中添加EhCache和Spring的相关依赖。确保`pom.xml`文件中包含以下依赖: ```xml ...
在实际应用中,Ehcache的分布式缓存复制还可以与Spring框架集成,通过Spring的缓存抽象层,简化配置和使用。此外,Ehcache提供了丰富的API,允许开发者在运行时动态地添加、移除或更新缓存项,甚至调整缓存策略,以...
总结,Ehcache二级缓存的配置涉及到多个方面,包括缓存管理、内存和磁盘存储、过期策略以及与Spring的集成。正确配置和使用Ehcache可以显著提高应用程序的响应速度和整体性能。在实际应用中,需要根据业务需求进行...
在这个场景中,`cglib-2.2.jar`和`ehcache-spring-annotations-1.1.2.jar`是两个关键的库文件,它们在实现Spring缓存机制中扮演着重要角色。 **CGLIB(Code Generation Library)** 是一个强大的高性能的代码生成库...
例如,我们可以在方法上使用`@Cacheable`注解,当该方法被调用时,结果会被缓存起来: ```java @Service public class UserService { @Cacheable(value = "users", key = "#id") public User getUser(String id) ...
通过以上步骤,你已经成功地将Spring AOP与EhCache集成,实现了一个简单的缓存实例。这种方式可以显著提高高访问量场景下的应用程序性能,同时保持代码的整洁和可维护性。在实际项目中,你可能还需要考虑更多因素,...
在SSH集成中,Ehcache常被用来缓存Hibernate的查询结果,避免频繁的数据库交互。Spring可以配置为自动管理Ehcache,包括启动、停止和更新缓存内容。 具体实现时,开发者需要编写相关的实体类、持久化映射文件、...