- 浏览: 577232 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
a1641693970:
还不错,学习了
BeanUtils使用总结(二)LazyDynaBean -
zjfshowtime:
很好的办法,学习了。
ORA-28001: the password has expired -
ya654277yo:
哦,多谢分享
Apache整合Tomcat后get方式提交中文乱码问题解决 -
foolkeeper:
nice !!
jvm内存参数设定 -
tracy821:
谢谢了,找了好久才找到
关于Spring 声明式事务处理时,throws exception不回滚的问题
Spring 3.1提供了对cache的支持,但到目前为止,支持的第三方cache只有Ehcache一种。在以前版本的spring中,也可以通过添加其它包实现对ehcache的注解化支持,但Spring 3.1提供了对cache的原生支持。
网上看了很多文章,虽然多个网站各种转载,还均不注明出处,但应该就是一个人写出来的大家抄而已。说抄可能不太好听,但是不注明转载的转载就是抄。废话少说,进入正题。
首先建好项目提供必要的包:
包的用处不多说,然后写好一个ehcache.xml放到classpath下:
ehcache.xml
<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<!--timeToIdleSeconds 当缓存闲置n秒后销毁 -->
<!--timeToLiveSeconds 当缓存存活n秒后销毁 -->
<!-- 缓存配置
name:缓存名称。
maxElementsInMemory:缓存最大个数。
eternal:对象是否永久有效,一但设置了,timeout将不起作用。
timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。
overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。
diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
maxElementsOnDisk:硬盘最大缓存个数。
diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。
clearOnFlush:内存数量最大时是否清除。
-->
<diskStore path="D:/tmpdir"/>
<defaultCache
maxElementsInMemory="500"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="1200"
overflowToDisk="true"/>
<cache name="young" maxElementsInMemory="150" eternal="false" timeToLiveSeconds="36000" timeToIdleSeconds="3600" overflowToDisk="true"/>
</ehcache>
配置文件中进行了基本的配置,建立了一个叫“young”的cache。
然后在非整合spring的时候,测试一下cache是否使用成功:
NormalTest.java
public class NormalTest {
public static void main(String[] args) {
CacheManager manager = CacheManager.create();// 默认配置文件创建
String[] names = manager.getCacheNames();
for (int i = 0; i < names.length; i++) {
System.out.println(names[i]);
}
//Cache cache = manager.getCache(names[0]);
Cache cache = new Cache("test", 150, true, false, 5, 2);
manager.addCache(cache);
cache.put(new Element("key1","value1"));
Element element = cache.get("key1");
System.out.println(element.getValue());
String[] names1 = manager.getCacheNames();
for (int i = 0; i < names1.length; i++) {
System.out.println(names1[i]);
}
}
}
运行一下,有输出存进去的值就OK啦。
下面开始整合Spring,建立Spring配置文件:
applicationContext.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:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:cache="http://www.springframework.org/schema/cache"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-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/context
http://www.springframework.org/schema/context/spring-context-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/cache
http://www.springframework.org/schema/cache/spring-cache.xsd">
<!-- 隐式地向 Spring 容器注册
AutowiredAnnotationBeanPostProcessor、
CommonAnnotationBeanPostProcessor、
PersistenceAnnotationBeanPostProcessor 以及
equiredAnnotationBeanPostProcessor 这 4 个 BeanPostProcessor。
在配置文件中使用 context 命名空间之前,
必须在 <beans> 元素中声明 context 命名空间。 -->
<context:annotation-config/>
<!-- <context:component-scan/> 配置项不但启用了对类包进行扫描
以实施注释驱动 Bean 定义的功能,
同时还启用了注释驱动自动注入的功能
(即还隐式地在内部注册了 AutowiredAnnotationBeanPostProcessor
和 CommonAnnotationBeanPostProcessor) -->
<context:component-scan base-package="young" />
<!-- 缓存注解驱动 -->
<cache:annotation-driven />
<!--
<cache:annotation-driven cache-manager="cacheManager" proxy-target-class="false" mode="proxy"/>-->
<!-- cacheManager工厂类 -->
<bean id="cacheManagerFactory" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
p:configLocation="classpath:ehcache.xml"
p:shared="false" />
<!-- 声明cacheManager -->
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"
p:cacheManager-ref="cacheManagerFactory"/>
</beans>
建立一个有缓存使用的类:
CacheMethod.java
package young;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Component;
@Component
public class CacheMethod {
@Cacheable("young")
public String getYoung(String str) {
System.out.println("method is running...");
return "1230-1230-1230-0123-0123";
}
}
类中只有一个方法,返回固定值,并且会被缓存。
最后用Junit4对这个类进行测试:
SpringCacheTest.java
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:applicationContext.xml" })
public class SpringCacheTest {
@Resource
CacheManager manager;
@Resource
CacheMethod method;
@Test
public void testGetYoung() {
// CacheMethod method = new CacheMethod();这样得到的实例不在Spring的管理之中,也无法Cache
String s = method.getYoung("str");
System.out.println(s);
String s1 = method.getYoung("str");
System.out.println(s1);
String[] names = manager.getCacheNames();
for (int i = 0; i < names.length; i++) {// 输出所有缓存
System.out.println(names[i]);
}
Cache young = manager.getCache("young");// 得到cache
System.out.println("Cache named 'young':" + young);
assertEquals("str", young.getKeys().get(0));
assertEquals(s, young.get("str").getValue());
}
}
到此应该就测试成功啦!~
最后说下我遇到的错误,最一开始在测试中这样写的:
CacheMethod method = new CacheMethod();
然后进行调用 ,发现返回值并没有进行缓存,再次调用时仍然会打印出getYoung()中的日志。这是由于这种调用并不是在Spring的管理下进行的,所以Spring也就不能对其进行cache了。
转:http://hi.baidu.com/coolcooldool/blog/item/3b541533c72b40e21a4cffda.html
网上看了很多文章,虽然多个网站各种转载,还均不注明出处,但应该就是一个人写出来的大家抄而已。说抄可能不太好听,但是不注明转载的转载就是抄。废话少说,进入正题。
首先建好项目提供必要的包:
包的用处不多说,然后写好一个ehcache.xml放到classpath下:
ehcache.xml
<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<!--timeToIdleSeconds 当缓存闲置n秒后销毁 -->
<!--timeToLiveSeconds 当缓存存活n秒后销毁 -->
<!-- 缓存配置
name:缓存名称。
maxElementsInMemory:缓存最大个数。
eternal:对象是否永久有效,一但设置了,timeout将不起作用。
timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。
overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。
diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
maxElementsOnDisk:硬盘最大缓存个数。
diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。
clearOnFlush:内存数量最大时是否清除。
-->
<diskStore path="D:/tmpdir"/>
<defaultCache
maxElementsInMemory="500"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="1200"
overflowToDisk="true"/>
<cache name="young" maxElementsInMemory="150" eternal="false" timeToLiveSeconds="36000" timeToIdleSeconds="3600" overflowToDisk="true"/>
</ehcache>
配置文件中进行了基本的配置,建立了一个叫“young”的cache。
然后在非整合spring的时候,测试一下cache是否使用成功:
NormalTest.java
public class NormalTest {
public static void main(String[] args) {
CacheManager manager = CacheManager.create();// 默认配置文件创建
String[] names = manager.getCacheNames();
for (int i = 0; i < names.length; i++) {
System.out.println(names[i]);
}
//Cache cache = manager.getCache(names[0]);
Cache cache = new Cache("test", 150, true, false, 5, 2);
manager.addCache(cache);
cache.put(new Element("key1","value1"));
Element element = cache.get("key1");
System.out.println(element.getValue());
String[] names1 = manager.getCacheNames();
for (int i = 0; i < names1.length; i++) {
System.out.println(names1[i]);
}
}
}
运行一下,有输出存进去的值就OK啦。
下面开始整合Spring,建立Spring配置文件:
applicationContext.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:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:cache="http://www.springframework.org/schema/cache"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-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/context
http://www.springframework.org/schema/context/spring-context-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/cache
http://www.springframework.org/schema/cache/spring-cache.xsd">
<!-- 隐式地向 Spring 容器注册
AutowiredAnnotationBeanPostProcessor、
CommonAnnotationBeanPostProcessor、
PersistenceAnnotationBeanPostProcessor 以及
equiredAnnotationBeanPostProcessor 这 4 个 BeanPostProcessor。
在配置文件中使用 context 命名空间之前,
必须在 <beans> 元素中声明 context 命名空间。 -->
<context:annotation-config/>
<!-- <context:component-scan/> 配置项不但启用了对类包进行扫描
以实施注释驱动 Bean 定义的功能,
同时还启用了注释驱动自动注入的功能
(即还隐式地在内部注册了 AutowiredAnnotationBeanPostProcessor
和 CommonAnnotationBeanPostProcessor) -->
<context:component-scan base-package="young" />
<!-- 缓存注解驱动 -->
<cache:annotation-driven />
<!--
<cache:annotation-driven cache-manager="cacheManager" proxy-target-class="false" mode="proxy"/>-->
<!-- cacheManager工厂类 -->
<bean id="cacheManagerFactory" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
p:configLocation="classpath:ehcache.xml"
p:shared="false" />
<!-- 声明cacheManager -->
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"
p:cacheManager-ref="cacheManagerFactory"/>
</beans>
建立一个有缓存使用的类:
CacheMethod.java
package young;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Component;
@Component
public class CacheMethod {
@Cacheable("young")
public String getYoung(String str) {
System.out.println("method is running...");
return "1230-1230-1230-0123-0123";
}
}
类中只有一个方法,返回固定值,并且会被缓存。
最后用Junit4对这个类进行测试:
SpringCacheTest.java
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:applicationContext.xml" })
public class SpringCacheTest {
@Resource
CacheManager manager;
@Resource
CacheMethod method;
@Test
public void testGetYoung() {
// CacheMethod method = new CacheMethod();这样得到的实例不在Spring的管理之中,也无法Cache
String s = method.getYoung("str");
System.out.println(s);
String s1 = method.getYoung("str");
System.out.println(s1);
String[] names = manager.getCacheNames();
for (int i = 0; i < names.length; i++) {// 输出所有缓存
System.out.println(names[i]);
}
Cache young = manager.getCache("young");// 得到cache
System.out.println("Cache named 'young':" + young);
assertEquals("str", young.getKeys().get(0));
assertEquals(s, young.get("str").getValue());
}
}
到此应该就测试成功啦!~
最后说下我遇到的错误,最一开始在测试中这样写的:
CacheMethod method = new CacheMethod();
然后进行调用 ,发现返回值并没有进行缓存,再次调用时仍然会打印出getYoung()中的日志。这是由于这种调用并不是在Spring的管理下进行的,所以Spring也就不能对其进行cache了。
转:http://hi.baidu.com/coolcooldool/blog/item/3b541533c72b40e21a4cffda.html
发表评论
-
Spring 多数据源声明式事务控制(PlatformTransactionManager )
2014-04-11 18:31 4722首先是TransactionManager的配置: ... -
Spring 动态数据源(AbstractRoutingDataSource )
2014-04-11 18:25 1662Spring动态配置多数据源,即在大型应用中对数据进行横向 ... -
(转)Spring Security 3.0 多页面登录配置
2012-10-19 17:01 5431网上很多文章是关于Spri ... -
Spring 中集成 JOTM 配置 JTA 事务
2011-12-27 19:52 1595Spring 中集成 JOTM 配置 JTA 事务: ... -
spring集成xfire教程
2011-04-02 15:20 1594配置web.xml <!-- SPRING ... -
关于Spring 声明式事务处理时,throws exception不回滚的问题
2010-09-29 23:31 9010前一段时间,项目代码评审,发现有TX不使用Spri ... -
iBatis SqlMap 的配置总结 收藏
2010-07-22 14:30 3756核心提示:SqlMap的配 ... -
ibatis oscache 使用中miss cache
2010-06-10 13:17 2891原始配置信息: <cacheModel id=&quo ... -
ibatis oscache配置以及【文件名、目录名或卷标语法不正确】错误解决
2010-05-26 13:13 3410sqlmap-config.xml 配置如下: < ... -
Hibernate+ehcache二级缓存技术
2010-02-01 20:57 9261、首先设置EhCache,建立配置文件ehcache.XML ... -
Hibernate的缓存讨论
2010-02-01 20:50 1118一般系统中有三种情况 ... -
OpenSessionInView Filter 但是发现不生效(转载)
2010-01-25 15:35 1791今天有一个朋友问了我一个问题,他使用的是Hibernate/S ... -
spring有三种启动方式,使用ContextLoaderServlet,ContextLoader
2010-01-19 17:25 1171spring有三种启动方式,使用ContextLoaderSe ... -
ApplicationContext和BeanFactory的关于单实例bean装载的区别
2010-01-19 17:04 1236Bean工厂延迟载入所有的Bean,直到getBean()方法 ... -
Spring AOP 学习小结(转载)
2010-01-06 21:24 1448一、AOP 概念 Joinpoint ... -
AOP术语(转载)
2010-01-06 21:04 1035AOP术语(转载) 2009-07-16 22:12 ... -
spring Lookup方法注入(转)---cglib解决子类过多问题、重构
2010-01-06 17:33 5930“Lookup方法”可以使Spri ... -
Spring JTA应用之Atomikos配置
2010-01-05 23:17 3759Atomikos,是一个基于Java的开源事务管理器,提供了事 ... -
多对多关系中Set的查询
2010-01-05 22:27 1097多对多关系中Set的查询 一个老师教多个学生,一个学生 ... -
ibatis 使用 in子句
2009-09-28 18:44 1878因为in的性能问题,平常不怎么用。今天特殊需求,在ibatis ...
相关推荐
Spring整合EhCache是一个常见的缓存管理方案,尤其在企业级Java应用中广泛使用。Spring框架提供了对多种缓存技术的支持,包括EhCache,这使得我们能够在Spring应用中轻松地实现数据缓存,提高系统性能。下面我们将...
在本示例中,我们探讨的是一个集成项目,它结合了Spring 3.1、Hibernate 4.2.1、JBPM 5.4和Ehcache,这四个组件都是Java开发中的关键工具,用于构建高效、可扩展的企业级应用程序。 **Spring 3.1**: Spring是一个...
标题中的"Spring 3.1.x + Hibernate 4.2.x + JBPM 5.2 + Ecache例子源码"代表了一个集成开发环境,其中包含了四个关键的技术组件: 1. **Spring 3.1.x**:这是一个开源的应用框架,主要用于简化Java企业级应用的...
尽管 Ehcache 已经发布到了 3.1 版本,但本文将以 2.10.2 版本为基础进行讲解,因为 Spring 4.x 版本尚不直接支持 Ehcache 3.x。尽管可以通过 JCache API 进行间接整合,但这可能会增加复杂性。 ### 安装 Ehcache ...
### Spring 整合 EhCache 实现原理与应用详解 #### 一、Spring 对 Cache 的支持 从 Spring 3.1 版本开始,Spring 框架正式引入了对 Cache 的支持,这种支持的方式和原理与 Spring 对事务管理的支持非常类似。通过...
这个项目可能是一个完整的业务流程管理系统,它整合了Spring、Hibernate、JBPM和Ecache等关键组件。下面将详细阐述这些技术及其在项目中的作用。 1. **Spring 3.1.x**: Spring 是一个开源的Java框架,用于简化...
本文将深入探讨Spring与Ehcache的整合,为后续的系列文章打下基础。 首先,我们要了解Spring对缓存的支持。Spring框架自3.1版本起引入了抽象的缓存管理机制,允许开发者选择不同的缓存实现,如Ehcache、Guava Cache...
3. 第二级缓存:通过缓存提供者如Ehcache,实现跨会话的数据共享。 4. HQL和 Criteria API:提供了更灵活的查询方式,降低了对SQL的依赖。 在本整合包中,还包含了处理JSON数据的包,这通常指的是Jackson或Gson库,...
Spring Cache 是 Spring 框架的一个模块,自 3.1 版本起引入,提供了基于注解的缓存抽象,使得开发者能够方便地在应用中集成和管理缓存。 一、Spring Cache 介绍 Spring Cache 提供了一种统一的方式来管理不同类型...
SpringEhcacheOne项目展示了如何通过JavaConfig配置Spring来整合Ehcache,从而提高应用程序的性能和效率。 Ehcache是一款流行的开源Java缓存库,它支持内存和磁盘存储,能够快速访问频繁使用的数据,减少数据库的...
1、SpringCache是Spring提供的一个缓存框架,在Spring3.1版本开始支持将缓存添加到现有的spring应用程序中,在4.1开始,缓存已支持JSR-107注释和更多自定义的选项 2、Spring Cache利用了AOP,实现了基于注解的缓存...
**Spring Boot整合Shiro搭建权限管理系统** 在Java开发领域,Spring Boot因其简洁的配置和强大的功能,已经成为构建微服务和企业级应用的首选框架。而Apache Shiro则是一款轻量级的安全框架,专注于身份验证、授权...
技术选型:Spring 4.0,Shiro 1.2,Spring MVC 4.0,Spring Task 4.0,MyBatis 3.1,Druid 1.0,Ehcache 2.6,Bootstrap 3.0。为了进行快速开发,目前集成了部分平台功能:系统用户,包含用户登录,用户的增删改查...
此项目整合了目前主流和最前源的web开发技术:采用ehcache实现二级缓存(包含查询缓存);用sf4j及logback(log4j的升级版)记录日志;proxool(据说是dbcp和c3p0三者中最优秀的)做连接池;使用jquery的ajax实现仿...
antlr-2.7.6.jar,antlr-2.7.7.jar,aopalliance-1.0.jar,asm-3.3.1.jar,cglib-2.2.jar,classes12.jar,commons-codec-1.7.jar,commons-collections-3.1.jar,commons-collections-3.2.1.jar,commons-lang-2.6.jar,...
Struts2与Spring的整合主要体现在Action类的管理上,可以通过Spring来创建和注入Action实例。 2. **Spring**:Spring是企业级应用的核心框架,提供了依赖注入(DI)和面向切面编程(AOP)等功能。在SSH整合中,...
### Spring Boot 整合 Redis 使用技巧详解 #### 一、Spring Cache 概览 Spring 3.1 版本引入了基于注解的缓存支持,提供了高度灵活且易于使用的缓存抽象层。Spring Cache 不仅支持使用 SpEL(Spring Expression ...
1. **Spring3.1与Hibernate4的整合** - Spring3.1不再支持HibernateTemplate,因为它认为Hibernate4自身的事务管理已经足够强大。因此,开发人员需要通过`getCurrentSession()`来获取session,而不是依赖...
此项目整合了目前主流和最前源的web开发技术:采用ehcache实现二级缓存(包含查询缓存);用sf4j及logback(log4j的升级版)记录日志;proxool(据说是dbcp和c3p0三者中最优秀的)做连接池;使用jquery的ajax实现仿...
Ehcache与Spring、Cocoon、Acegi等流行框架的集成,简化了缓存配置过程,为开发者提供了更广阔的发挥空间。 ### 四、结语 综上所述,《Ehcache用户指南》不仅是一份详尽的技术手册,更是指导开发者掌握高效缓存...