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

Ehcache集成Spring缓存方法结果

阅读更多

这是接上篇<<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)即可添加到缓存。

 

 

0
1
分享到:
评论

相关推荐

    Ehcache集成Spring的使用(转载)

    这篇博客将深入探讨如何将 Ehcache 集成到 Spring 应用中,以及如何使用 Spring AOP 实现计算结果的缓存。 首先,集成 Ehcache 到 Spring 需要以下步骤: 1. **引入依赖**: 在 Maven 或 Gradle 的配置文件中添加 ...

    Spring+Ehcache集成

    **Spring与Ehcache集成详解** 在现代Java应用开发中,缓存技术是提升系统性能的关键环节。Ehcache作为一款流行的开源缓存解决方案,因其轻量级、高性能和易于集成的特点,常被广泛应用于Spring框架中。本篇文章将...

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

    ### Ehcache 整合Spring 使用页面、对象缓存 #### 一、Ehcache简介与特点 Ehcache是一款开源的、高性能的Java...通过上述步骤,您可以轻松地将Ehcache集成到您的Spring项目中,利用其强大的功能来优化您的应用程序。

    SpringBoot 集成Ehcache实现缓存

    #### 二、Spring Boot与Ehcache集成 在Spring Boot项目中集成Ehcache可以显著提高系统的响应速度和性能。下面将详细介绍如何在一个Spring Boot项目中集成并使用Ehcache缓存。 ##### 1. 创建项目 首先,使用IDEA...

    ehcache+spring demo 整合

    Ehcache 是一款高效、流行的Java缓存库,它能够帮助...这个项目是学习和理解如何在Spring应用中集成Ehcache的一个好起点,你可以通过运行这两个工程,观察缓存的使用效果,逐步掌握如何在实际项目中利用缓存优化性能。

    spring + ehcache + redis两级缓存

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

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

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

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

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

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

    Spring对ehCache的支持使得集成更加简便,我们可以利用Spring的缓存抽象来管理ehCache实例,包括设置缓存策略、大小限制等。 为了实现数据更新时的缓存刷新,我们可以利用Spring的事件驱动模型。当创建、更新或删除...

    springMVC+Ehcache的各级缓存(包括页面缓存)

    - 方法级缓存:使用`@Cacheable`注解标记方法,每次调用该方法时,会首先检查缓存中是否有结果,如果有则直接返回,否则执行方法并将结果存入缓存。 - 类级缓存:整个类的所有方法共享同一份缓存,适用于所有方法...

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

    在SpringBoot应用中集成Ehcache,通常需要以下步骤: 1. **环境配置**:首先,你需要在SpringBoot的`pom.xml`文件中添加Ehcache和相关依赖。同时,在`application.properties`或`application.yml`文件中配置Ehcache...

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

    通过Spring4的Java配置方式,我们可以轻松地集成EhCache到我们的项目中,实现对页面整体或局部内容的缓存。 首先,我们需要在项目中添加EhCache和Spring的相关依赖。确保`pom.xml`文件中包含以下依赖: ```xml ...

    基于JGROUPS的ehcache的分布式缓存复制

    在实际应用中,Ehcache的分布式缓存复制还可以与Spring框架集成,通过Spring的缓存抽象层,简化配置和使用。此外,Ehcache提供了丰富的API,允许开发者在运行时动态地添加、移除或更新缓存项,甚至调整缓存策略,以...

    ehcache二级缓存配置文件

    总结,Ehcache二级缓存的配置涉及到多个方面,包括缓存管理、内存和磁盘存储、过期策略以及与Spring的集成。正确配置和使用Ehcache可以显著提高应用程序的响应速度和整体性能。在实际应用中,需要根据业务需求进行...

    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)** 是一个强大的高性能的代码生成库...

    Spring+EhCache缓存实例

    例如,我们可以在方法上使用`@Cacheable`注解,当该方法被调用时,结果会被缓存起来: ```java @Service public class UserService { @Cacheable(value = "users", key = "#id") public User getUser(String id) ...

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

    通过以上步骤,你已经成功地将Spring AOP与EhCache集成,实现了一个简单的缓存实例。这种方式可以显著提高高访问量场景下的应用程序性能,同时保持代码的整洁和可维护性。在实际项目中,你可能还需要考虑更多因素,...

    ssh,struts+hibernate+spring+ehcache集成

    在SSH集成中,Ehcache常被用来缓存Hibernate的查询结果,避免频繁的数据库交互。Spring可以配置为自动管理Ehcache,包括启动、停止和更新缓存内容。 具体实现时,开发者需要编写相关的实体类、持久化映射文件、...

Global site tag (gtag.js) - Google Analytics