Spring 3.1:缓存和EhCache

如果在网上查找使用Spring 3.1内置缓存的示例,那么通常会碰到Spring的SimpleCacheManager ,Spring的家伙说这对“用于测试或简单的缓存声明很有用”。 实际上,我更喜欢将SimpleCacheManager看作是轻量级的,而不是简单的。 在您希望每个JVM占用少量内存缓存的情况下很有用。 如果Spring的家伙正在经营一家超市,那么SimpleCacheManager将属于他们自己品牌的“基本”产品范围。

另一方面,如果您需要一个可扩展,持久和分布式的重型缓存,则Spring还附带内置的ehCache包装器。

好消息是,Spring的缓存实现之间的交换很容易。 从理论上讲,这完全是配置问题,为了证明该理论正确,我从Caching和@Cacheable博客中获取了示例代码,并使用EhCache实现对其进行了运行。

配置步骤与我上一篇博客“ 缓存和配置”中描述的步骤相似,您仍然需要指定:

<cache:annotation-driven />

…在您的Spring配置文件中以打开缓存。 您还需要定义一个id为cacheManager的bean,只是这一次您引用Spring的EhCacheCacheManager类而不是SimpleCacheManager

<bean id='cacheManager'class='org.springframework.cache.ehcache.EhCacheCacheManager'p:cacheManager-ref='ehcache'/>

上面的示例演示了EhCacheCacheManager配置。 注意,它引用了另一个ID为“ ehcache ”的bean。 配置如下:

<bean id='ehcache' class='org.springframework.cache.ehcache.EhCacheManagerFactoryBean'p:configLocation='ehcache.xml'p:shared='true'/>

ehcache ”具有两个属性: configLocationshared
configLocation ”是一个可选属性,用于指定ehcache配置文件的位置。 在测试代​​码中,我使用了以下示例文件:

<?xml version='1.0' encoding='UTF-8'?>
<ehcache xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:noNamespaceSchemaLocation='http://ehcache.org/ehcache.xsd'><defaultCache eternal='true' maxElementsInMemory='100' overflowToDisk='false' /><cache name='employee' maxElementsInMemory='10000' eternal='true' overflowToDisk='false' />
</ehcache>

…这将创建两个缓存:一个默认缓存和一个名为“员工”的缓存。

如果缺少此文件,则EhCacheManagerFactoryBean只需选择一个默认的ehcache配置文件: ehcache-failsafe.xml ,该文件位于ehcache的ehcache-core jar文件中。

另一个EhCacheManagerFactoryBean属性是' shared '。 这被认为是可选的,因为文档指出它定义了“ EHCache CacheManager是应该共享(作为VM级别的单例)还是独立的(通常在应用程序内部)。 默认值为'false',创建一个独立的实例。” 但是,如果将其设置为false,则将收到以下异常:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.cache.interceptor.CacheInterceptor#0': Cannot resolve reference to bean 'cacheManager' while setting bean property 'cacheManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cacheManager' defined in class path resource [ehcache-example.xml]: Cannot resolve reference to bean 'ehcache' while setting bean property 'cacheManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ehcache' defined in class path resource [ehcache-example.xml]: Invocation of init method failed; nested exception is net.sf.ehcache.CacheException: Another unnamed CacheManager already exists in the same VM. Please provide unique names for each CacheManager in the config or do one of following:
1. Use one of the CacheManager.create() static factory methods to reuse same CacheManager with same name or create one if necessary
2. Shutdown the earlier cacheManager before creating new one with same name.
The source of the existing CacheManager is: InputStreamConfigurationSource [stream=java.io.BufferedInputStream@424c414]at org.springframework.beans.factory.support.BeanDefinitionValueResolver.
resolveReference(BeanDefinitionValueResolver.java:328)at org.springframework.beans.factory.support.BeanDefinitionValueResolver.
resolveValueIfNecessary(BeanDefinitionValueResolver.java:106)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.
applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1360)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.
populateBean(AbstractAutowireCapableBeanFactory.java:1118)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.
doCreateBean(AbstractAutowireCapableBeanFactory.java:517)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.
createBean(AbstractAutowireCapableBeanFactory.java:456)
... stack trace shortened for clarityat org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.
java:683)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.
run(RemoteTestRunner.java:390)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.
main(RemoteTestRunner.java:197)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cacheManager' defined in class path resource [ehcache-example.xml]: Cannot resolve reference to bean 'ehcache' while setting bean property 'cacheManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ehcache' defined in class path resource [ehcache-example.xml]: Invocation of init method failed; nested exception is net.sf.ehcache.CacheException: Another unnamed CacheManager already exists in the same VM. Please provide unique names for each CacheManager in the config or do one of following:
1. Use one of the CacheManager.create() static factory methods to reuse same CacheManager with same name or create one if necessary
2. Shutdown the earlier cacheManager before creating new one with same name.
The source of the existing CacheManager is: InputStreamConfigurationSource [stream=java.io.BufferedInputStream@424c414]at org.springframework.beans.factory.support.BeanDefinitionValueResolver.
resolveReference(BeanDefinitionValueResolver.java:328)at org.springframework.beans.factory.support.BeanDefinitionValueResolver.
resolveValueIfNecessary(BeanDefinitionValueResolver.java:106)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.
applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1360)
... stack trace shortened for clarityat org.springframework.beans.factory.support.AbstractBeanFactory.
getBean(AbstractBeanFactory.java:193)at org.springframework.beans.factory.support.BeanDefinitionValueResolver.
resolveReference(BeanDefinitionValueResolver.java:322)... 38 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ehcache' defined in class path resource [ehcache-example.xml]: Invocation of init method failed; nested exception is net.sf.ehcache.CacheException: Another unnamed CacheManager already exists in the same VM. Please provide unique names for each CacheManager in the config or do one of following:
1. Use one of the CacheManager.create() static factory methods to reuse same CacheManager with same name or create one if necessary
2. Shutdown the earlier cacheManager before creating new one with same name.
The source of the existing CacheManager is: InputStreamConfigurationSource [stream=java.io.BufferedInputStream@424c414]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.
initializeBean(AbstractAutowireCapableBeanFactory.java:1455)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.
doCreateBean(AbstractAutowireCapableBeanFactory.java:519)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.
createBean(AbstractAutowireCapableBeanFactory.java:456)at org.springframework.beans.factory.support.AbstractBeanFactory$1
.getObject(AbstractBeanFactory.java:294)at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.
getSingleton(DefaultSingletonBeanRegistry.java:225)at org.springframework.beans.factory.support.AbstractBeanFactory.
doGetBean(AbstractBeanFactory.java:291)at org.springframework.beans.factory.support.AbstractBeanFactory.
getBean(AbstractBeanFactory.java:193)at org.springframework.beans.factory.support.BeanDefinitionValueResolver.
resolveReference(BeanDefinitionValueResolver.java:322)... 48 more
Caused by: net.sf.ehcache.CacheException: Another unnamed CacheManager already exists in the same VM. Please provide unique names for each CacheManager in the config or do one of following:
1. Use one of the CacheManager.create() static factory methods to reuse same CacheManager with same name or create one if necessary
2. Shutdown the earlier cacheManager before creating new one with same name.
The source of the existing CacheManager is: InputStreamConfigurationSource [stream=java.io.BufferedInputStream@424c414]at net.sf.ehcache.CacheManager.assertNoCacheManagerExistsWithSameName(CacheManager.
java:521)at net.sf.ehcache.CacheManager.init(CacheManager.java:371)at net.sf.ehcache.CacheManager.(CacheManager.java:339)at org.springframework.cache.ehcache.EhCacheManagerFactoryBean.
afterPropertiesSet(EhCacheManagerFactoryBean.java:104)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.
invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.
initializeBean(AbstractAutowireCapableBeanFactory.java:1452)... 55 more

…当您尝试运行一系列单元测试时。

我认为这归结为Spring的ehcache管理器工厂的一个简单错误,因为它试图使用new()创建多个缓存实例,而不是使用“其中一种CacheManager.create()静态工厂方法”作为例外,允许其重用相同名称的相同CacheManager。 因此,我的第一个JUnit测试工作正常,但其他所有测试均失败。

令人反感的代码行是:

this.cacheManager = (this.shared ? CacheManager.create() : new CacheManager());

为了完整性,下面列出了我的完整XML配置文件:

<?xml version='1.0' encoding='UTF-8'?>
<beans xmlns='http://www.springframework.org/schema/beans' xmlns:p='http://www.springframework.org/schema/p'xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'xmlns:cache='http://www.springframework.org/schema/cache' xmlns:context='http://www.springframework.org/schema/context'xsi:schemaLocation='http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsdhttp://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd'><!-- Switch on the Caching --><cache:annotation-driven /><!-- Do the component scan path --><context:component-scan base-package='caching' /><bean id='cacheManager' class='org.springframework.cache.ehcache.EhCacheCacheManager' p:cacheManager-ref='ehcache'/><bean id='ehcache' class='org.springframework.cache.ehcache.EhCacheManagerFactoryBean' p:configLocation='ehcache.xml'  p:shared='true'/> 
</beans>

在使用ehcache时,要考虑的唯一其他配置详细信息是Maven依赖项。 这些非常简单,因为Ehcache的专家们将所有各种ehcache jar组合到一个Maven POM模块中。 可以使用下面的XML将该POM模块添加到项目的POM文件中:

<dependency><groupId>net.sf.ehcache</groupId><artifactId>ehcache</artifactId><version>2.6.0</version><type>pom</type><scope>test</scope></dependency>

最后,可以从Maven Central和Sourceforge存储库中获得ehcache Jar文件:

<repositories><repository><id>sourceforge</id><url>http://oss.sonatype.org/content/groups/sourceforge/</url><releases><enabled>true</enabled></releases><snapshots><enabled>true</enabled></snapshots></repository></repositories>

祝您编程愉快,别忘了分享!

参考: Spring 3.1:来自Captain Debug's Blog博客的JCG合作伙伴 Roger Hughes的缓存和EhCache 。


翻译自: https://www.javacodegeeks.com/2012/10/spring-31-caching-and-ehcache.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/371310.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql-表完整性约束

阅读目录 一 介绍二 not null与default三 unique四 primary key五 auto_increment六 foreign key七 总结一 介绍 回到顶部 约束条件与数据类型的宽度一样&#xff0c;都是可选参数 作用&#xff1a;用于保证数据的完整性和一致性主要分为&#xff1a; PRIMARY KEY (PK) 标识…

可消费消息数量_17 个方面,综合对比 主流消息队列

一、资料文档二、开发语言三、支持的协议四、消息存储五、消息事务六、负载均衡七、集群方式八、管理界面九、可用性十、消息重复十一、吞吐量TPS十二、订阅形式和消息分发十三、顺序消息十四、消息确认十五、消息回溯十六、消息重试十七、并发度本文将从&#xff0c;Kafka、Ra…

opencv2.4.13+python2.7学习笔记--使用 knn对手写数字OCR

阅读对象&#xff1a;熟悉knn、了解opencv和python。 1.knn理论介绍&#xff1a;算法学习笔记&#xff1a;knn理论介绍 2. opencv中knn函数 路径&#xff1a;opencv\sources\modules\ml\include\opencv2\ml\ml.hpp 3.案例 3.1数据集介绍 我们的目的是创建一个可以对手写数字进行…

热启动必须联网吗_供暖结束,地暖是关闭供水阀门还是关闭回水阀门?你做对了吗?...

天气渐渐暖和起来很多城市都停止供暖了一些家庭也停止使用地暖那么今天就来聊一聊&#xff0c;停止供暖后地暖系统应该怎么保养地暖不用时候是关闭供水阀门还是关闭回水阀门&#xff1f;供暖结束 暖气阀门到底要不要关一般来说&#xff0c;我们供暖期结束是不用关闭总阀门的。因…

python学习(九) 网络编程学习--简易网站服务器

python 网络编程和其他语言都是一样的&#xff0c;服务器这块步骤为&#xff1a;1. 创建套接字2. 绑定地址3. 监听该描述符的所有请求4. 有新的请求到了调用accept处理请求 Python Web服务器网关接口&#xff08;Python Web Server Gateway Interface&#xff0c;简称“WSGI”&…

按条件分类_保税仓储企业能否同时存储非保货物?“仓储货物安装台分类监管”如何申请?...

保税仓储企业能否同时存储非保货物呢&#xff1f;保税和非保货物是不是真的不能同在一个“屋檐下”呢&#xff1f;哪些企业可以开展“仓储货物按状态分类监管”业务&#xff1f;企业又该如何申请该项业务&#xff1f;本文就对这些问题进行一下梳理。什么是“仓储货物按状态分类…

ZooKeeper的原理(转)

一、ZooKeeper的角色 领导者&#xff08;Leader&#xff09;&#xff0c;负责进行投票的发起和决议&#xff0c;更新系统状态。 学习者&#xff08;Learner&#xff09;&#xff0c;包括跟随者&#xff08;Follower&#xff09;和观察者&#xff08;Observer&#xff09;&#…

java课堂笔记

转载于:https://www.cnblogs.com/16-C-kai/p/6567042.html

Spring– DAO和服务层

欢迎来到Spring教程的第三部分。 在这一部分中&#xff0c;我们将继续编写Timesheet应用程序&#xff0c;这次我们将实现DAO层&#xff0c;业务服务并编写一些测试。 在上一部分中&#xff0c;我们定义了GenericDao接口&#xff0c;该接口告诉我们需要对实体执行哪些操作。 现在…

51nod 1907(多项式乘法启发式合并)

题目&#xff1a; 分析&#xff1a; 对于一个确定的生成子图&#xff0c;很明显是在一个连通块上走&#xff0c;走完了再跳到另一个连通块上&#xff0c;假设连通块个数为cnt&#xff0c;那么答案一定是$min(a_{cnt-1},a_cnt,..,a_{n-1})$ 那现在的问题就是如何求出对于原图而言…

煮饭的机器人作文_公示|“笔随我心、心由笔动”作文大赛获奖名单

卡士大昌杯“笔随我心、心由笔动”获奖作品开平的咸汤圆滑轮记&#xff0f;我的宅家成长记折叠式小屋&#xff0f;夕阳&#xff0f;包粽子在过去的卡士大昌杯“笔随我心、心由笔动”作文活动中我们收到了许多优秀投稿经过专业团队评选得出获奖选手作品如下主办方协办方一等奖《…

JavaFX 2 GameTutorial第5部分

介绍 这是与JavaFX 2 Game Tutorial相关的六部分系列的第五部分。 我知道自从我写关于游戏的博客以来已经很长时间了&#xff0c;但希望您仍然与我在一起。 如果您想回顾一下&#xff0c;请阅读第1部分 &#xff0c; 第2 部分 &#xff0c; 第3 部分和第4 部分 &#xff0c;以了…

Hive中的数据库、表、数据与HDFS的对应关系

1、hive数据库 我们在hive终端&#xff0c;查看数据库信息&#xff0c;可以看出hive有一个默认的数据库default&#xff0c;而且我们还知道hive数据库对应的是hdfs上面的一个目录&#xff0c;那么默认的数据库default到底对应哪一个目录呢&#xff1f;我们可以通过hive配置文件…

使用JSF的面向服务的UI

在大型软件开发项目中&#xff0c;面向服务的体系结构非常常见&#xff0c;因为它提供了可供不同团队或部门使用的功能接口。 创建用户界面时&#xff0c;应应用相同的原理。 对于具有开票部门和客户管理部门等的大型公司&#xff0c;组织结构图可能如下所示&#xff1a; 如果计…

JBoss核心Java Web服务

这篇博客文章涉及Web服务。 好吧&#xff0c;更确切地说&#xff0c;它处理JBoss上的“普通” java Web服务。 这意味着我们将创建一个没有任何其他框架&#xff08;如CXF&#xff0c;Axis等&#xff09;的Web服务。 JBoss它自己提供对Web服务的支持。 因此&#xff0c;如果您真…

JavaSE--for each

参考&#xff1a;http://blog.csdn.net/yasi_xi/article/details/25482173 学习多线程的时候实例化线程数组而挖掘出来的一直以来的理解误区 之前一直以为for each 本质上和for循环以及迭代器没什么区别 1 package foreach;2 3 public class ForeachDemo1 {4 5 public …

mysql 5.1.62_MySQL 5.5.62 安装方法(标准配置版)

1.此安装方法适用于绝大多数MySQL版本&#xff0c;首先在MySQL官网上下载好所需版本。2.(官网可能不太好找)在我的博客列表中有一篇是MySQL官网下载链接&#xff0c;直达下载界面&#xff0c;方便。3.下载。(安装版 MSI Installer)4.下载安装包然后双击开始安装选择同意协议并…

简化Java内存分析

作为一名典型的Java开发人员&#xff0c;除了遵循关闭连接&#xff0c;流等典型的最佳实践外&#xff0c;我从未监视过应用程序的内存使用情况。最近&#xff0c;我们在JBoss服务器中遇到了一些问题&#xff0c;不得不深入研究内存管理Java中最好的事情之一是&#xff0c;创建对…

详解mysql数据库的启动与终止_详解MySQL数据库的启动与终止(一)

由于MySQL服务器具有多种安装分发&#xff0c;而且能够运行在多种操作平台之上&#xff0c;因此它的启动与停止的方法也多种多样。你可以根据实际情况使用其中的一种。在你安装、升级或者维护系统时&#xff0c;你可能需要多次启动和终止服务器&#xff0c;你需要了解启动和终止…

easyui 插入中间行

function inserrow() {var index_dx 0;var index_lt 0;var rows $(#dg).datagrid(getRows)//获取当前的数据行前期数据准备for (var i 0; i < rows.length; i) {if (rows[i][运营商] 电信) {index_dx i;dxptjss_dx parseInt(rows[i][短信平台接收数]);} else {index_…