`
lastsoul
  • 浏览: 34881 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ehcache缓存方法返回结果(一)-MethodCacheInterceptor

    博客分类:
  • WEB
 
阅读更多
对象缓存就是将查询的数据,添加到缓存中,下次再次查询的时候直接从缓存中获取,而不去数据库中查询。

对象缓存一般是针对方法、类而来的,结合Spring的Aop对象、方法缓存就很简单。这里需要用到切面编程,用到了Spring的MethodInterceptor

代码如下:
package com.last.cache.ehcache.filter;
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.apache.log4j.Logger;
import org.springframework.beans.factory.InitializingBean;
 
public class MethodCacheInterceptor implements MethodInterceptor, InitializingBean {
 
    private static final Logger log = Logger.getLogger(MethodCacheInterceptor.class);
    
    private Cache cache;
 
    public void setCache(Cache cache) {
        this.cache = cache;
    }
 
    public void afterPropertiesSet() throws Exception {
        log.info(cache + " A cache is required. Use setCache(Cache) to provide one.");
    }
 
    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 = 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);
            } else {
                log.info(cacheKey + "使用缓存: " + cache.getName());
            }
        }
        return element.getValue();
    }
 
    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();
    }
}


web.xml
<context-param>  
        <param-name>contextConfigLocation</param-name>  
        <param-value>
        	classpath:spring-*.xml
        </param-value>  
    </context-param> 
	<listener>  
        <listener-class>  
         org.springframework.web.context.ContextLoaderListener 
        </listener-class>  
    </listener>  


spring-ehcache.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
	xmlns:p="http://www.springframework.org/schema/p" xmlns:util="http://www.springframework.org/schema/util"
	xmlns:task="http://www.springframework.org/schema/task" xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context-3.0.xsd
		http://www.springframework.org/schema/tx
		http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
		http://www.springframework.org/schema/aop
		http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
		http://www.springframework.org/schema/util
		http://www.springframework.org/schema/util/spring-util-3.0.xsd
		http://www.springframework.org/schema/task
		http://www.springframework.org/schema/task/spring-task-3.0.xsd
		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
     	http://www.springframework.org/schema/cache 
     	http://www.springframework.org/schema/cache/spring-cache.xsd">

	<context:component-scan base-package="com.last" />

	<!-- 配置eh缓存管理器 -->
	<bean id="mycacheManager"
		class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" p:shared="true" />

	<!-- 配置一个简单的缓存工厂bean对象 -->
	<bean id="simpleCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
		<property name="cacheManager" ref="mycacheManager" />
		<!-- 使用缓存 关联ehcache.xml中的缓存配置 -->
		<property name="cacheName" value="mobileCache" />
	</bean>

	<!-- 配置一个缓存拦截器对象,处理具体的缓存业务 -->
	<bean id="cacheAdvice" class="com.last.cache.ehcache.filter.MethodCacheInterceptor">
		<property name="cache" ref="simpleCache" />
	</bean>


	<aop:config proxy-target-class="false">
		<!-- "execution(* com.last.service.*.*(..))" -->
		<aop:pointcut id="pc"
			expression="(execution(* com.last.service.impl.*.find*(..))) or (execution(* com.last.service.impl2.*.find*(..)))" />
		<aop:advisor pointcut-ref="pc" advice-ref="cacheAdvice" />
	</aop:config>
</beans>


AOP的配置展示了如何使用多个表达式,有一点要注意,过滤包名下的任意方法要多一个星,如:execution(* com.last.service.impl.*.find*(..))  表示impl下及子包下的方法,并不能去掉这个星,变成execution(* com.last.service.impl.find*(..))  ,表示impl下的方法也不能改成上面这样。
分享到:
评论

相关推荐

    ehcache监控工具ehcache-monitor-kit-1.0.3

    1.解压缩到目录下,复制ehcache-monitor-kit-1.0.0\lib\ehcache-probe-1.0.0.jar包到application的web-inf/lib目录下 2.将以下配置copy的ehcache.xml文件的ehcache标签中,注:上述链接中说的配置少写了个probe包名...

    Ehcache 3(ehcache-clustered-3.8.1-kit.zip)

    在"ehcache-clustered-3.8.1-kit.zip"这个压缩包中,我们重点关注的是Ehcache的集群支持版本,这使得多个节点能够协同工作,共享和同步缓存数据,从而提高系统的可扩展性和可用性。 Ehcache 3 的核心概念包括缓存...

    ehcache.rar ehcache-core-2.6.10.jar依赖包

    ehcache-core-2.6.10.jar依赖包 MyBatiesEhCache二级缓存 Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个...

    ehcache缓存jar(ehcache-core-2.4.6.jar+ehcache-web-2.0.4.jar)

    ehcache缓存jar(ehcache-core-2.4.6.jar+ehcache-web-2.0.4.jar)

    shiro-ehcache-1.4.0-API文档-中文版.zip

    赠送jar包:shiro-ehcache-1.4.0.jar; 赠送原API文档:shiro-ehcache-1.4.0-javadoc.jar; 赠送源代码:shiro-ehcache-1.4.0-sources.jar; 赠送Maven依赖信息文件:shiro-ehcache-1.4.0.pom; 包含翻译后的API文档...

    ehcache1.6 和 ehcache-web-2.0.4

    5. **缓存监控**: Ehcache-web提供了一个监控界面,可以通过HTTP端点访问,查看缓存统计信息、执行清理操作等。这对于调试和性能调优非常有用。 6. **日志集成**: SLF4J提供了日志框架的通用接口,确保日志输出的...

    ehcache-core-2.6.11-API文档-中英对照版.zip

    赠送jar包:ehcache-core-2.6.11.jar; 赠送原API文档:ehcache-core-2.6.11-javadoc.jar; 赠送源代码:ehcache-core-2.6.11-sources.jar; 赠送Maven依赖信息文件:ehcache-core-2.6.11.pom; 包含翻译后的API文档...

    Mybatis-ehcache 1.2.1源码(ehcache-cache-mybatis-ehcache-1.2.1.zip)

    在执行SQL后,是如何将结果存入Ehcache的,以及在后续的查询中,如何检查Ehcache并返回缓存的结果。 4. **Key生成策略**:关键在于如何生成唯一的缓存键,通常基于SQL语句和参数,以确保相同条件的查询能命中同一...

    Mybatis-ehcache 1.2.1源码(ehcache-cache-mybatis-ehcache-1.2.1.tar

    Mybatis-ehcache 1.2.1 是一个集成项目,它将 Ehcache 缓存系统与 Mybatis 框架结合在一起,提供了一种高效、便捷的数据缓存解决方案。在这一版本中,Ehcache 被用作 Mybatis 的二级缓存,以改善数据库查询性能并...

    ehcache-3.3.1-API文档-中文版.zip

    赠送jar包:ehcache-3.3.1.jar; 赠送原API文档:ehcache-3.3.1-javadoc.jar; 赠送源代码:ehcache-3.3.1-sources.jar; 赠送Maven依赖信息文件:ehcache-3.3.1.pom; 包含翻译后的API文档:ehcache-3.3.1-javadoc-...

    Ehcache 2.10.8(bigmemory-max-4.3.8.4.2.tar.gz)

    Ehcache是一款广泛使用的开源Java缓存解决方案,它允许开发者在应用程序中添加高效的缓存机制,从而提升性能和响应速度。Ehcache 2.10.8是该产品的特定版本,它包含了针对缓存管理和优化的一系列特性和改进。在...

    ehcache-3.3.1-API文档-中英对照版.zip

    赠送jar包:ehcache-3.3.1.jar; 赠送原API文档:ehcache-3.3.1-javadoc.jar; 赠送源代码:ehcache-3.3.1-sources.jar; 赠送Maven依赖信息文件:ehcache-3.3.1.pom; 包含翻译后的API文档:ehcache-3.3.1-javadoc-...

    ehcache-1.6.0-beta1-javadoc

    ehcache-1.6.0-beta1-javadoc

    ehcache-2.10.0-API文档-中文版.zip

    赠送jar包:ehcache-2.10.0.jar; 赠送原API文档:ehcache-2.10.0-javadoc.jar; 赠送源代码:ehcache-2.10.0-sources.jar; 包含翻译后的API文档:ehcache-2.10.0-javadoc-API文档-中文(简体)版.zip 对应Maven...

    ehcache-2.10.0-API文档-中英对照版.zip

    赠送jar包:ehcache-2.10.0.jar 赠送原API文档:ehcache-2.10.0-javadoc.jar 赠送源代码:ehcache-2.10.0-sources.jar 包含翻译后的API文档:ehcache-2.10.0-javadoc-API文档-中文(简体)-英语-对照版.zip 对应...

    shiro-ehcache-1.3.2-API文档-中英对照版.zip

    赠送jar包:shiro-ehcache-1.3.2.jar; 赠送原API文档:shiro-ehcache-1.3.2-javadoc.jar; 赠送源代码:shiro-ehcache-1.3.2-sources.jar; 赠送Maven依赖信息文件:shiro-ehcache-1.3.2.pom; 包含翻译后的API文档...

    Ehcache Java 缓存框架 v3.9.2-源码.zip

    Ehcache是一个流行的Java缓存框架,用于提高应用程序性能,减少对数据库的访问频率,从而降低系统的整体负载。它的最新版本v3.9.2提供了更高效、更易用的特性,适合各种规模的项目。在深入理解Ehcache之前,我们需要...

    shiro-ehcache-1.2.3-API文档-中英对照版.zip

    赠送jar包:shiro-ehcache-1.2.3.jar; 赠送原API文档:shiro-ehcache-1.2.3-javadoc.jar; 赠送源代码:shiro-ehcache-1.2.3-sources.jar; 赠送Maven依赖信息文件:shiro-ehcache-1.2.3.pom; 包含翻译后的API文档...

    cache/ehcache缓存使用

    读取缓存时,我们使用`cache.get()`方法,如果找到对应的键,则返回对应的Element对象,从中提取出缓存的对象。 `RuntimeMessage.java`可能是一个包含运行时消息处理的类,与Ehcache缓存的具体实现关系不大,但可能...

Global site tag (gtag.js) - Google Analytics