- 浏览: 110350 次
- 性别:
- 来自: 杭州
文章分类
最新评论
配置
1. applicationContext.xml
复制代码
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:cache="http://www.springframework.org/schema/cache"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd">
<cache:annotation-driven />
<!-- 定义缓存管理 -->
<bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
<property name="caches">
<set>
<bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean"
p:name="default"/>
<bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean"
p:name="activityCache"/>
<bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean"
p:name="awardsCache"/>
</set>
</property>
</bean>
复制代码
Spring内部默认使用 ConcurrentHashMap 来存储, 配置中的 activityCache awardsCache 就是一个一个的 ConcurrentHashMap 对象的名字. 另外 spring还支持使用 EHCache 来存储缓存.
2. 在service的实现类上加上 @Cacheable
复制代码
//@Service
//public class LotteryActivityServiceImpl implements LotteryActivityService
@Cacheable(value = "activityCache", key = "#shortName")
public LotteryActivity findByShortName(String shortName) {
log.info("query activity : {} from database.", shortName);
return activityRepository.findByShortName(shortName);
}
复制代码
@Cacheable参数
value 缓存的名称,在 spring 配置文件中定义,必须指定至少一个 例如:@Cacheable(value=”mycache”) 或者
@Cacheable(value={”cache1”,”cache2”}
key 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合 例如:
@Cacheable(value=”testcache”,key=”#userName”)
condition 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存 例如:
@Cacheable(value=”testcache”,condition=”#userName.length()>2”)
在需要清除缓存的方法上加上@CacheEvict
@CacheEvict(value="activityCache", allEntries = true, beforeInvocation = true)
public void cleanActivityCache(String shortName) {
log.info("cleaned cache activity : {}", shortName);
}
@CacheEvict 参数
value 缓存的名称,在 spring 配置文件中定义,必须指定至少一个 例如:
@CachEvict(value=”mycache”) 或者
@CachEvict(value={”cache1”,”cache2”}
key 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合 例如:
@CachEvict(value=”testcache”,key=”#userName”
condition 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才清空缓存 例如:
@CachEvict(value=”testcache”,
condition=”#userName.length()>2”)
allEntries 是否清空所有缓存内容,缺省为 false,如果指定为 true,则方法调用后将立即清空所有缓存 例如:
@CachEvict(value=”testcache”,allEntries=true)
beforeInvocation 是否在方法执行前就清空,缺省为 false,如果指定为 true,则在方法还没有执行的时候就清空缓存,缺省情况下,如果方法执行抛出异常,则不会清空缓存 例如:
@CachEvict(value=”testcache”,beforeInvocation=true)
当需要保证方法被调用,又希望结果被缓存, 可以使用@CachePut
@CachePut(value="accountCache",key="#account.getName()")// 更新 accountCache 缓存
public Account updateAccount(Account account) {
return updateDB(account);
}
@CachePut 参数
value 缓存的名称,在 spring 配置文件中定义,必须指定至少一个 例如:
@Cacheable(value=”mycache”) 或者
@Cacheable(value={”cache1”,”cache2”}
key 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合 例如:
@Cacheable(value=”testcache”,key=”#userName”)
condition 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存 例如:
@Cacheable(value=”testcache”,condition=”#userName.length()>2”)
注解最好加在实现类而不是接口的方法上
复制代码
Spring recommends that you only annotate concrete classes (and methods of concrete classes) with the @Cache* annotation, as opposed to annotating interfaces. You certainly can place the @Cache* annotation on an interface (or an interface method), but this works only as you would expect it to if you are using interface-based proxies. The fact that Java annotations are not inherited from interfaces means that if you are using class-based proxies (proxy-target-class="true") or the weaving-based aspect (mode="aspectj"), then the caching settings are not recognized by the proxying and weaving infrastructure, and the object will not be wrapped in a caching proxy, which would be decidedly bad.
复制代码
带有@Cache* 注解的方法不能被定义在调用该方法的类里, 比如 UserController要调用 findUserByName(String name), 且该方法有 @Cacheabele注解, 那么该方法就不能被定义在 UserController中
In proxy mode (which is the default), only external method calls coming in through the proxy are intercepted. This means that self-invocation, in effect, a method within the target object calling another method of the target object, will not lead to an actual caching at runtime even if the invoked method is marked with @Cacheable - considering using the aspectj mode in this case.
@Cache*注解要加在 public 方法上
When using proxies, you should apply the @Cache* annotations only to methods with public visibility. If you do annotate protected, private or package-visible methods with these annotations, no error is raised, but the annotated method does not exhibit the configured caching settings. Consider the use of AspectJ (see below) if you need to annotate non-public methods as it changes the bytecode itself.
1. applicationContext.xml
复制代码
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:cache="http://www.springframework.org/schema/cache"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd">
<cache:annotation-driven />
<!-- 定义缓存管理 -->
<bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
<property name="caches">
<set>
<bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean"
p:name="default"/>
<bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean"
p:name="activityCache"/>
<bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean"
p:name="awardsCache"/>
</set>
</property>
</bean>
复制代码
Spring内部默认使用 ConcurrentHashMap 来存储, 配置中的 activityCache awardsCache 就是一个一个的 ConcurrentHashMap 对象的名字. 另外 spring还支持使用 EHCache 来存储缓存.
2. 在service的实现类上加上 @Cacheable
复制代码
//@Service
//public class LotteryActivityServiceImpl implements LotteryActivityService
@Cacheable(value = "activityCache", key = "#shortName")
public LotteryActivity findByShortName(String shortName) {
log.info("query activity : {} from database.", shortName);
return activityRepository.findByShortName(shortName);
}
复制代码
@Cacheable参数
value 缓存的名称,在 spring 配置文件中定义,必须指定至少一个 例如:@Cacheable(value=”mycache”) 或者
@Cacheable(value={”cache1”,”cache2”}
key 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合 例如:
@Cacheable(value=”testcache”,key=”#userName”)
condition 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存 例如:
@Cacheable(value=”testcache”,condition=”#userName.length()>2”)
在需要清除缓存的方法上加上@CacheEvict
@CacheEvict(value="activityCache", allEntries = true, beforeInvocation = true)
public void cleanActivityCache(String shortName) {
log.info("cleaned cache activity : {}", shortName);
}
@CacheEvict 参数
value 缓存的名称,在 spring 配置文件中定义,必须指定至少一个 例如:
@CachEvict(value=”mycache”) 或者
@CachEvict(value={”cache1”,”cache2”}
key 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合 例如:
@CachEvict(value=”testcache”,key=”#userName”
condition 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才清空缓存 例如:
@CachEvict(value=”testcache”,
condition=”#userName.length()>2”)
allEntries 是否清空所有缓存内容,缺省为 false,如果指定为 true,则方法调用后将立即清空所有缓存 例如:
@CachEvict(value=”testcache”,allEntries=true)
beforeInvocation 是否在方法执行前就清空,缺省为 false,如果指定为 true,则在方法还没有执行的时候就清空缓存,缺省情况下,如果方法执行抛出异常,则不会清空缓存 例如:
@CachEvict(value=”testcache”,beforeInvocation=true)
当需要保证方法被调用,又希望结果被缓存, 可以使用@CachePut
@CachePut(value="accountCache",key="#account.getName()")// 更新 accountCache 缓存
public Account updateAccount(Account account) {
return updateDB(account);
}
@CachePut 参数
value 缓存的名称,在 spring 配置文件中定义,必须指定至少一个 例如:
@Cacheable(value=”mycache”) 或者
@Cacheable(value={”cache1”,”cache2”}
key 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合 例如:
@Cacheable(value=”testcache”,key=”#userName”)
condition 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存 例如:
@Cacheable(value=”testcache”,condition=”#userName.length()>2”)
注解最好加在实现类而不是接口的方法上
复制代码
Spring recommends that you only annotate concrete classes (and methods of concrete classes) with the @Cache* annotation, as opposed to annotating interfaces. You certainly can place the @Cache* annotation on an interface (or an interface method), but this works only as you would expect it to if you are using interface-based proxies. The fact that Java annotations are not inherited from interfaces means that if you are using class-based proxies (proxy-target-class="true") or the weaving-based aspect (mode="aspectj"), then the caching settings are not recognized by the proxying and weaving infrastructure, and the object will not be wrapped in a caching proxy, which would be decidedly bad.
复制代码
带有@Cache* 注解的方法不能被定义在调用该方法的类里, 比如 UserController要调用 findUserByName(String name), 且该方法有 @Cacheabele注解, 那么该方法就不能被定义在 UserController中
In proxy mode (which is the default), only external method calls coming in through the proxy are intercepted. This means that self-invocation, in effect, a method within the target object calling another method of the target object, will not lead to an actual caching at runtime even if the invoked method is marked with @Cacheable - considering using the aspectj mode in this case.
@Cache*注解要加在 public 方法上
When using proxies, you should apply the @Cache* annotations only to methods with public visibility. If you do annotate protected, private or package-visible methods with these annotations, no error is raised, but the annotated method does not exhibit the configured caching settings. Consider the use of AspectJ (see below) if you need to annotate non-public methods as it changes the bytecode itself.
发表评论
-
Java线程Dump分析工具--jstack(转摘纪录)
2015-10-29 10:47 854jstack用于打印出给 ... -
多角度看 Java 中的泛型
2014-05-13 15:40 735本文摘自:http://www.ibm.c ... -
java.lang.Object类 方法(转)
2014-05-13 10:55 2020Object类的方法 构造方法:public Obje ... -
为什么Java byte 类型的取值范围是-128~127(short int long同理)
2014-05-12 18:08 2099为什么Java byte 类型的取值范围是-128~127 ... -
web.xml之context-param,listener,filter, servlet启动顺序和讲解
2014-05-12 14:32 1002首先可以确定的一点是, 不同类型节点的加载顺序与它们在web. ... -
java对象初始化书序
2014-05-09 15:05 595package com.test.aa.service; p ... -
java.lang.ThreadLocal详解以及注意事项
2014-04-29 18:12 2543一.什么是ThreadLocal? ThreadLocal ... -
String Stringbuilder StringBuffer区别
2014-04-17 11:00 712关于这三者的区别,我们从官方API上很容易找到答案。 ... -
JAVA反射机制
2014-04-03 15:15 342JAVA反射机制: 通俗地说,反射机制就是可以把一个类, ... -
ArrayList和linkedList几种循环性能比较
2014-03-26 17:51 643请 参照 http://www.trinea.cn/andr ... -
HashMap原理
2014-03-20 15:31 557本文由 ImportNew - 唐小娟 ... -
java.lang.Cloneable
2014-03-20 11:22 605public interface Cloneable 此类实 ... -
Java集合框架学习总结
2014-03-14 16:43 736以下介绍经常使用的集合类,这里不介绍集合类的使用方法,只介绍 ... -
maven项目管理的一些知识
2014-03-04 16:24 555http://sishuok.com/forum/blogPo ... -
Xms Xmx PermSize MaxPermSize 区别
2014-02-20 16:13 642Eclipse崩溃,错误提示: ... -
JAVA基础-栈与堆,static、final修饰符、内部类和Java内存分配
2014-01-17 20:00 1134堆:顺序随意 栈:后进 ... -
debug遇到找不到源码的情况解决方案
2013-12-19 18:46 774在做JAVA开发的时候 页面端调用了接口服务端 找问题需要页面 ... -
工作学习2013-11-6
2013-11-06 20:20 5281.在用maven进行项目构建的时候 可以先建立以个maven ... -
运行jtest出现 No value found for property database.type 错误解决办法
2013-06-06 11:25 1781错误信息: Caused by: org.jtester.mo ...
相关推荐
本文将详细讲解"cache/ehcache缓存使用"的相关知识点,包括缓存的基本概念、Ehcache的介绍、以及如何在Java应用中使用Ehcache进行缓存操作。 首先,我们要理解什么是缓存。缓存是一种存储技术,它临时存储常用或...
本文将详细介绍Ehcache的基本使用和集群配置。 ### Ehcache 基础使用 1. **安装与引入**: 首先,你需要将Ehcache的JAR包添加到你的项目类路径中。你可以通过Maven或Gradle等构建工具进行依赖管理,或者直接下载JAR...
Ehcache是一个开源的、高性能的Java缓存库,它为应用程序...此外,还要注意并发控制,确保在多线程环境下正确使用缓存,避免数据一致性问题。通过深入理解和有效应用Ehcache,可以显著提升Java应用的性能和响应速度。
在Spring Boot 2.x中,EhCache是一个常用的缓存解决方案,用于...不过,要注意根据实际需求调整EhCache的配置,例如缓存大小、过期策略等,以确保缓存的最佳效果。同时,还要注意监控和管理缓存,防止内存泄漏等问题。
10. **最佳实践**:在实际开发中,需要根据业务场景选择合适的数据缓存策略,避免过度依赖缓存导致的问题,同时也要注意缓存穿透、缓存雪崩和缓存击穿等常见问题,并采取相应的解决方案。 综上所述,Hibernate 与 ...
Ehcache是一款广泛使用的开源Java缓存解决方案,而Spring框架则为它提供了一个方便的集成层,使得我们可以在不修改核心业务代码的情况下轻松地添加缓存功能。 首先,我们需要在项目中引入Ehcache和Spring的相关依赖...
### EHCache API的基本用法 #### 一、EHCache简介 EHCache 是一款开源的 ...综上所述,EHCache 提供了一套完整且强大的缓存解决方案,通过合理配置和正确使用其提供的 API,可以极大地提高应用程序的性能和响应速度。
在实际使用过程中,注意监控缓存的性能,如命中率、缓存大小、存取速度等,以便进行调优。同时,还要考虑缓存的一致性问题,比如在多节点环境中如何保持数据的一致性,以及如何在更新数据库时同步更新缓存。 总的来...
在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者用面向对象的方式处理...然而,使用缓存的同时也要注意缓存管理和维护,避免出现缓存雪崩、缓存穿透等问题,确保系统的稳定性和可靠性。
Ehcache Monitor则是其配套的监控工具,允许开发者和运维人员实时查看和分析Ehcache的运行状态,以便优化缓存策略和解决可能出现的问题。下面我们将详细探讨Ehcache Monitor的安装配置过程。 首先,你需要从Ehcache...
Ehcache 是一款广泛使用的开源 Java 缓存解决方案,自 2003 年发布以来,不断根据用户需求和反馈进行迭代与完善。其功能强大且灵活,能够满足各种应用场景下的缓存需求。 #### 二、开始使用(Getting Started) 1....
在Spring配置文件(如`applicationContext.xml`)中,定义Ehcache的相关配置: ```xml <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> ...
6. **最佳实践**:教程可能会讨论使用缓存的最佳实践,如合理设置缓存大小,处理缓存穿透和雪崩问题,以及在多线程环境下使用Ehcache需要注意的事项。 7. **源码分析**:由于标签中有“源码”,我们可以期待看到...
在本文中,我们将深入探讨如何在Spring框架中集成并使用AOP(面向切面编程)来实现对EHCache的高效管理。Spring是一个广泛使用的Java应用框架,它提供了强大的依赖注入和面向切面编程功能。而EHCache是一款流行、高...
Ehcache是一个流行的Java缓存库,用于提高应用程序性能,通过存储经常访问的数据来减少数据库交互。...然而,需要注意的是,过度依赖缓存可能会导致内存管理问题,因此需要平衡缓存的使用和系统资源的消耗。
在1.5版本中,可能会遇到一些异常情况,这可能是由于与其他库的兼容性问题、配置错误或者缺少某些依赖导致的。在Java开发中,尤其是在使用Spring框架和SSH(Struts、Spring、Hibernate)三位一体的架构时,Ehcache是...
Java Ehcache是一个流行的开源缓存解决方案,用于在Java应用程序中高效地存储和检索数据,以减少数据库负载并提高性能。Ehcache的核心是`ehcache-core-2.6.8.jar`,它提供了缓存管理的基本功能,如缓存创建、缓存...
- **Spring整合**:如果项目使用Spring,还需要在`applicationContext.xml`中配置MyBatis和Ehcache的bean,使MyBatis能够识别并使用Ehcache作为缓存。 - **Mapper配置**:在Mapper接口或者XML配置文件中,使用`@...
- 注意缓存同步问题,尤其是在分布式环境中。 - 定期清理无用的缓存,避免内存泄漏。 通过以上步骤,你可以在Spring应用中实现EhCache的简单整合,提高应用程序的性能和响应速度。在实际项目中,根据业务场景灵活...
2. "EHCache技术文档详解.doc":如前文描述,这份文档提供了EHCache的详细技术信息,包括配置、API使用、最佳实践等,是学习和使用EHCache的重要参考资料。 3. "ehcache-2.7.3-distribution.tar.gz":这是原始的...