- 浏览: 7349347 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (1546)
- 企业中间件 (236)
- 企业应用面临的问题 (236)
- 小布Oracle学习笔记汇总 (36)
- Spring 开发应用 (54)
- IBatis开发应用 (16)
- Oracle基础学习 (23)
- struts2.0 (41)
- JVM&ClassLoader&GC (16)
- JQuery的开发应用 (17)
- WebService的开发应用 (21)
- Java&Socket (44)
- 开源组件的应用 (254)
- 常用Javascript的开发应用 (28)
- J2EE开发技术指南 (163)
- EJB3开发应用 (11)
- GIS&Mobile&MAP (36)
- SWT-GEF-RCP (52)
- 算法&数据结构 (6)
- Apache开源组件研究 (62)
- Hibernate 学习应用 (57)
- java并发编程 (59)
- MySQL&Mongodb&MS/SQL (15)
- Oracle数据库实验室 (55)
- 搜索引擎的开发应用 (34)
- 软件工程师笔试经典 (14)
- 其他杂项 (10)
- AndroidPn& MQTT&C2DM&推技术 (29)
- ActiveMQ学习和研究 (38)
- Google技术应用开发和API分析 (11)
- flex的学习总结 (59)
- 项目中一点总结 (20)
- java疑惑 java面向对象编程 (28)
- Android 开发学习 (133)
- linux和UNIX的总结 (37)
- Titanium学习总结 (20)
- JQueryMobile学习总结 (34)
- Phonegap学习总结 (32)
- HTML5学习总结 (41)
- JeeCMS研究和理解分析 (9)
最新评论
-
lgh1992314:
[u][i][b][flash=200,200][url][i ...
看看mybatis 源代码 -
尼古拉斯.fwp:
图片根本就不出来好吧。。。。。。
Android文件图片上传的详细讲解(一)HTTP multipart/form-data 上传报文格式实现手机端上传 -
ln94223:
第一个应该用排它网关吧 怎么是并行网关, 并行网关是所有exe ...
工作流Activiti的学习总结(八)Activiti自动执行的应用 -
ZY199266:
获取不到任何消息信息,请问这是什么原因呢?
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息 -
xiaoyao霄:
DestinationSourceMonitor 报错 应该导 ...
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息
在项目中使用缓存我OSCache,今天有时间将所有的EHCache的缓存的应用关注一下。首先我们看看Spring和EHCache采用AOP实现的缓存实现。
1.首先使用EHCache编写EHCache的配置文件。
<ehcache> <diskStore path="java.io.tmpdir" /> <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="2" timeToLiveSeconds="5" overflowToDisk="true" maxElementsOnDisk="10000000" diskPersistent="false" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU" /> <cache name="testCache" maxElementsInMemory="10000" maxElementsOnDisk="1000" eternal="false" overflowToDisk="false" diskSpoolBufferSizeMB="20" timeToIdleSeconds="60" timeToLiveSeconds="3600" memoryStoreEvictionPolicy="LFU" /> </ehcache>
2.编写AOP的方法拦截器,此处采用环绕通知的方式实现方法拦截。
package com.easyway.ecache.service; 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.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.InitializingBean; /** * AOP方法拦截实现缓存的更新的 * * MethodInterceptor:在方法调用会自动调用 * InitializingBean:系统初始化时会自动初始化此类的特定的方法afterPropertiesSet() * @author longgangbai * */ 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; } //invoke方法会在spring配置文件里的,指明的cache拦截的方法的调用时,自动触发它,如这个项目里, //当运行HelloEhcacheSpring.java类时,在showPersonsInfo方法里调用到personManager.getList()方法时, //它就会先调到这里来执行,执行完才行下执行它的业务 public Object invoke(MethodInvocation invocation) throws Throwable { //这个表示哪个类调用(或触发)了这个MethodCacheInterceptor, String targetName = invocation.getThis().getClass().getName(); //这个表示哪个方法触发了这个类(MethodCacheInterceptor)方法(invoke)的调用, String methodName = invocation.getMethod().getName(); //调用的参数,这里没有参数 Object[] arguments = invocation.getArguments(); Object result; //这里得出的是:manager.PersonManagerImpl.getList String cacheKey = getCacheKey(targetName, methodName, arguments); Element element = cache.get(cacheKey); if (element == null) { // call target/sub-interceptor //这个就是调用数据访问方法, result = invocation.proceed(); //如这里调用了getList()方法,会先打印出"get Person from DB" , //然后将结果集放入到result里面去,这里由于使用的是自己配置只能放入10个元素的ehcache, //所以这里的result是ArrayList<E> ,它里面存放的是elementData[10],并将getList得到的结果放入到elementData里面去了 System.out.println("set into cache"); // cache method result //下面方法执行后,将cacheKey与数据集连起来,cacheKey是用来标识这个element的标志,我们可以有多个element(各自是来自不同的数据访问方法而形成的),区分它们就是用cacheKey, //这里的新生成后的element,含有cacheKey,还在element创建时间,访问时间,还有命令次数等cache的属性,我觉得它就像是一个小cache一样,下次要不要更新它就要看它的这些属性来决定。 element = new Element(cacheKey, (Serializable) result); //放入cache中 cache.put(element); }else{ logger.debug("come from cache ...!"); } //完成cache操作 System.out.println("out cache"); return element.getValue(); } /** * 缓存特定的类: * @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."); } } }
3.Spring的关于缓存的配置类似事物的配置:
<?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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd" default-lazy-init="true"> <!--配置缓存管理器 --> <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> <property name="configLocation"> <value>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>com.easyway.MethodCache</value> </property> </bean> <!-- 自定义缓存拦截器 --> <bean id="methodCacheInterceptor" class="com.easyway.ecache.service.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> <!-- 下面的配置就使得在数据访问时,cache将拦截从数据库获取的数据,与cache数据比较,如有就不放入cache,没有就放入,更新到数据库去,也是先存入cache,再更新到数据库中去 --> <property name="patterns"> <list> <value>.*getServiceName</value> <value>.*testMethod</value> </list> </property> </bean> <!-- 声明一个服务 --> <bean id = "ticketServiceTarget" class="com.easyway.ecache.service.TicketService" /> <!-- 相关的服务 --> <bean id="ticketService" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="target"> <ref local="ticketServiceTarget"/> </property> <property name="interceptorNames"> <list> <value>methodCachePointCut</value> </list> </property> </bean> </beans>
4.测试服务类:
package com.easyway.ecache.service; import java.util.List; /** * 对其所有的以testMethod* ,getServiceName方式命令的方法, * 进行缓存处理。当调用其他命令时,不进行缓存 * @author longgangbai * */ @SuppressWarnings("unchecked") public class TicketService { public String testMethod(){ System.out.println("没走缓存,直接调用TestService.testMethod()"); return "china"; } public void updateMethod(){ System.out.println("updateMethod"); } public void insertMethod(){ System.out.println("insertMethod"); } public void deleteMethod(){ System.out.println("deleteMethod"); } /** * 需要缓存的集合 */ private List ticketList; /** * 需要缓存的服务名称 */ private String serviceName; public String getServiceName() { return serviceName; } public void setServiceName(String serviceName) { this.serviceName = serviceName; } public List getTicketList() { return ticketList; } public void setTicketList(List ticketList) { this.ticketList = ticketList; } /** * 修改的服务端名称备注但是不缓存 * @param serviceName */ public void changesetServiceName(String serviceName) { this.serviceName = serviceName; } }
5.测试用例
package com.easyway.ecache.service; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * 这里使用了ehcache与spring结合,这里并没用用到数据库,用spring只是用来管理bean, * 这里用ehcache就相当于数据库,存放对象信息 * @author longgangbai */ @SuppressWarnings({"unchecked"}) public class HelloEhcacheSpring{ public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("classpath*:applicationContext.xml"); TicketService ticketSrv = (TicketService) context.getBean("ticketService"); //配置了spring就可以从配置文件里找到对应的接口实现类,再生成实例对象,以完成业务处理 String srvName0=ticketSrv.testMethod(); //获取初始化服务端名称 System.out.println("srvName0="+srvName0); //设置存储的名称 ticketSrv.setServiceName("ticketService"); String srvName1=ticketSrv.testMethod(); //获取服务端名称 System.out.println("srvName1="+srvName1); //修改服务名称但是不缓存 ticketSrv.updateMethod(); String srvName2=ticketSrv.testMethod(); //获取服务端名称来源自缓存注意观察 System.out.println("srvName2="+srvName2); } }
6.测试结果:
没走缓存,直接调用TestService.testMethod()
打印信息如下:
set into cache
out cache
srvName0=china
out cache
srvName1=china
updateMethod
out cache
srvName2=china
- SpringEHCache.rar (6.7 MB)
- 下载次数: 202
发表评论
-
【转】在项目中使用多个数据源-多sessionFactory方案
2013-05-10 16:30 3136适用范围:适合SSH架构访问多个数据库, ... -
【转】使用spring的动态路由实现数据库负载均衡
2013-03-17 22:57 3316使用spring的动态路由实现数据库负载均衡 系统中 ... -
【转】spring 数据库读写分离
2013-03-17 22:56 2813什么是数据库的读写分离 数据库的读写分离简单的说是把对数据 ... -
[转]Spring+iBatis+JOTM实现JTA事务
2013-03-17 22:51 3069Spring+iBatis+JOTM实现JTA事务 ... -
Spring 和Axis2整合相关那些事
2012-12-29 12:58 10424Axis2优劣: 现在用axis2开发一个webse ... -
【转】JAVA并发容器代码随读
2012-12-06 15:29 2959转载自 http://rdc.taobao.c ... -
Spring3.04和Junit4
2011-11-27 18:15 4404在Spring3.x以上必须采用 ... -
Spring加载属性文件的扩展
2011-08-22 12:21 3030在项目中一个属性文件配置信息,提供给数据连接信息 ... -
Brap和Spring整合(简单权限验证)
2011-07-26 10:31 1396在使用Spring的发 ... -
Quartz的任务的临时启动和暂停和恢复
2011-07-16 10:18 40260在项目中需要手动启停某些服务,那么需要有一个控 ... -
Quartz中定时调度EJB3.0服务
2011-07-13 22:25 2941在quartz2.0中只支持EJb2.0的服务 ... -
Quartz中定时调度EJB2.0服务
2011-07-13 22:12 2187在Quartz2.0中提供支持EJB2.0 ... -
Quartz的简单使用
2011-07-13 22:05 9960最近工作需要学习quartz,那么必须首先了解三个概念:调度器 ... -
Brap 远程访问调用 和Spring整合(二)
2010-12-08 14:52 2012Brap和 Spring 整合使用如 ... -
闲着没事Hessian开发WebService的总结(二)
2010-12-07 20:30 4044在Spring和Hessian整合中,以前 ... -
Spring JMX的学习总结(三) 基于注释的JMX的使用
2010-12-03 17:26 3366具体实现JMX的注释的类: package c ... -
Spring JMX的总结学习(二) 注解实现MBean
2010-12-03 17:24 6293本文采用Spring JMX ... -
Spring JMX的总结学习(一)基于标准接口的JMX
2010-12-03 17:21 3786在Spring中采用JMX标准形式的,开发相关的Spr ... -
Spring JMS的开发应用--自定义消息转换器的使用(四)
2010-12-03 01:37 2521在Spring JMS、中可以通过实现Me ... -
Spring JBOSSMQ JMS的开发应用(三)
2010-11-30 20:11 2351如果用过JMS的话,会发现它类似写JD ...
相关推荐
本篇文章将深入探讨如何在Spring中通过AOP来整合EHCache,特别是在使用Spring Modules的情况下。 首先,我们需要理解Spring Modules(SpringModule)项目,这是一个为Spring框架提供额外功能的开源项目,它包含了对...
接下来,我们将讨论如何整合Spring AOP和EhCache来创建一个简单的缓存实例: 1. **引入依赖**:首先,你需要在项目的pom.xml文件中添加Spring AOP和EhCache的相关依赖。确保引入最新版本的Spring Framework和...
在"Spring+Hibernate+ehcache整合"项目中,开发者已经完成了一个将这三个框架集成的基础工程。虽然Struts没有被明确提及,但通常在Web开发中,Spring与Struts结合可以构建更完整的MVC架构。这个整合项目可能包含以下...
这个"spring+ibatis+ehcache整合例子"是一个完整的示例项目,展示了如何将这三个框架无缝集成到一个基于MySQL数据库的应用中。下面将详细介绍这三个框架及其整合的关键点。 **Spring框架** Spring是一个全面的企业...
这篇博客“spring struts2 hibernate ehcache整合”显然探讨了如何将这四个组件集成到同一个项目中,以提升应用程序的性能和效率。以下是关于这些技术及其整合的关键知识点的详细说明: 1. **Spring框架**:Spring...
Shiro与Spring的集成使得安全控制更为便捷,可以在应用中实现权限控制、登录验证等。 Ehcache是一个流行的Java缓存解决方案,用于提高应用程序的性能。它可以缓存数据库查询结果、对象实例等,减少对后端存储的访问...
【Spring3 Hibernate4 Ehcache整合实例详解】 在Java企业级应用开发中,Spring、Hibernate和Ehcache是三个非常重要的框架和技术。Spring作为轻量级的IoC(Inversion of Control)和AOP(Aspect Oriented ...
在这个"spring+ehcache示例整合Demo"中,我们将会探讨如何将Ehcache集成到Spring框架中,以实现高效的缓存管理。 首先,我们需要在项目的`pom.xml`文件中引入Ehcache和Spring的依赖。Ehcache通常使用的是`org....
在"ehcache+spring demo 整合"项目中,我们有两个工程:一个Web工程和一个Java工程。Web工程通常用于构建前端展示和处理HTTP请求,而Java工程则包含了业务逻辑和服务层。这样的划分使得代码结构清晰,易于维护。 1....
当我们谈论“Spring + Ehcache + Redis”两级缓存时,我们实际上是在讨论如何在Java环境中利用Spring框架来集成Ehcache作为本地缓存,并利用Redis作为分布式二级缓存,构建一个高效且可扩展的缓存解决方案。...
通过Spring AOP(面向切面编程)和Ehcache的结合使用,可以在Spring管理的应用中轻松实现数据缓存,提升应用性能。 首先,Ehcache是一个广泛使用的Java本地缓存框架,它能够缓存各种数据类型,如集合、对象等。使用...
具体实现时,开发者需要编写相关的实体类、持久化映射文件、Struts Action、Spring配置文件等,并在项目中进行整合配置。例如,为了使用Ehcache,需要在Spring配置文件中添加Ehcache的相关bean,然后在Hibernate的...
总的来说,这个压缩包文件提供了一个基础的Java Web项目模板,展示了如何整合Maven、Spring、Spring MVC和Ehcache来实现一个具备缓存功能的Web应用。开发者可以通过学习和修改这个实例,加深对这些技术的理解并应用...
2. **Spring 4.2**:Spring是一个全面的企业级应用框架,它支持依赖注入(DI)、面向切面编程(AOP)、事务管理等核心特性。Spring 4.2版本在前一版本的基础上优化了性能,并引入了对Java 8的支持,包括Lambda表达式...
4. **整合缓存**:使用Spring的AOP(面向切面编程)和Ehcache的注解,在需要缓存的方法上添加`@Cacheable`,在清除缓存的方法上添加`@CacheEvict`。 5. **测试验证**:编写测试用例,确保 BoneCP 能够正常提供数据库...
4. Spring与Ehcache整合:Ehcache是一款广泛使用的内存缓存系统,能显著提升应用性能。Spring支持Ehcache作为二级缓存,通过声明式配置,可以将数据存储在内存中,减少数据库查询,提高响应速度。 5. Spring与...
在Java开发中,Ehcache和MyBatis的整合是一个常见的需求,特别是在处理大量数据时,缓存可以显著提升应用程序的性能。Ehcache是一个开源的、轻量级的缓存解决方案,而MyBatis是一个优秀的持久层框架,两者结合可以...
在JavaWeb开发中,Spring、Spring MVC、Hibernate和Ehcache是四个非常关键的框架,它们共同构建了一个高效、灵活的后台系统。下面将详细解释这些框架的核心功能、使用场景以及它们之间的协作关系。 首先,Spring...
Spring框架通过`EhCacheCacheManager`提供了一种无缝整合EhCache的方式。 1. **依赖引入**:确保项目中包含了Spring Cache和EhCache的相关依赖。 ```xml <!-- Maven --> <groupId>org.springframework.boot ...