今天学习Spring 缓存机制。遇到不少问题~

好不easy缓存的单元測试用例调试成功了,在同一项目下单元測试另外一个文件时,发生了异常:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cacheManagerFactory' defined in file [D:\workspaces\eclipse_svn\NewsPortalProject\WebContent\WEB-INF\classes\config\ehcache.applicationContext.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.

最后发现原因:

因为项目下有三个配置文件。都放在同一文件夹下:

在另个单元測试用例中实例化Spring容器的时候,全部的配置文件都载入进去了

ApplicationContext aCtx = new FileSystemXmlApplicationContext("classpath:config/*.xml");

解决的方法:将缓存的配置文件和其它的配置文件放在不同包下

1.缓存測试用例中。实例化容器时,仅仅读缓存相关的配置文件;

ApplicationContext aCtx = new FileSystemXmlApplicationContext("classpath:ehcache/*.xml");

2.其它用例也仅仅读自己的配置文件。

ApplicationContext aCtx = new FileSystemXmlApplicationContext("classpath:config/*.xml");

最后贴一段实现缓存的单元測试用例,机器配置文件

配置文件路径:/project/src/test/resources/ehcache



ehcache.xml

<?xml version="1.0" encoding="UTF-8"?

>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
updateCheck="false">
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory="1000"
eternal="false"
timeToIdleSeconds="10"
timeToLiveSeconds="10"
overflowToDisk="false"/>
<cache name="cachelist"
eternal="false"
timeToIdleSeconds="360"
timeToLiveSeconds="3600"
maxElementsInMemory="100"
overflowToDisk="false"
diskPersistent="false"
memoryStoreEvictionPolicy="LRU" />
</ehcache>

ehcache.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:context="http://www.springframework.org/schema/context"
xmlns:oxm="http://www.springframework.org/schema/oxm"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:cache="http://www.springframework.org/schema/cache"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/cache
http://www.springframework.org/schema/cache/spring-cache.xsd">
<!-- 缓存 属性-->
<context:component-scan base-package="com.test" />
<bean id="cacheManagerFactory" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<property name="configLocation" value="classpath:ehcache/ehcache.xml"/>
</bean>
<!-- 支持缓存注解 -->
<cache:annotation-driven cache-manager="cacheManager" />
<!-- 默认是cacheManager -->
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager" >
<property name="cacheManager" ref="cacheManagerFactory"/>
</bean>
</beans>

DirectcityCacheTest.java

package com.test.news.util;

import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext; /**
*
* 项目名称:NewsPortalProject
* 类名称:DirectcityCacheTest
* 类描写叙述:
* 创建人:XianJuanJuan
* 创建时间:2015年6月2日 下午2:11:45
* @version
*
*/
public class DirectcityCacheTest { @BeforeClass
public static void setUpBeforeClass() throws Exception {
} @SuppressWarnings("resource")
@Test
public void init() {
ApplicationContext aCtx = new FileSystemXmlApplicationContext("classpath:ehcache/*.xml");
CacheManager cacheManager = (CacheManager) aCtx.getBean("cacheManager");
// 为了測试缓存是否成功,这里加一个
for (int i = 0; i<5;i++) {
Object obj = cacheManager.getCache("newslist").get("a1");
String data = null;
if (obj == null) {
System.out.println("i="+i+";第一次运行该方法,缓存中还没有数据");
} else {
data = (String) cacheManager.getCache("newslist").get("a1").get();
System.out.println("i="+i+";第"+i+"次读到的缓存中的内容:"+cacheManager.getCache("newslist").get("a1").get());
}
String list = ""+i;
if (data == null) {
list = list + "String";
if(list != null && !"".equals(list)) {
Cache cache = cacheManager.getCache("newslist");
if (cache != null) {
cache.put("a1", list);
}
} }
}
}
}

结果:

单元測试调试好的代码,放在resin下一跑。类似异常又发生了。经过一番周折之后,最终见着曙光了~

详细解决的方法:
1.将项目中其它目录下多余的配置文件删掉。终于
src/main/resources/ehcache/ehcache.xml
WebContent/WEB-INF/config/ehcache.applicationContext.xml  
WebContent/WEB-INF/config/springmvc-servlet.xml
2.将D:\resin-4.0.35\webapps\ProjectTest\WEB-INF和D:\resin-4.0.35\webapps\ProjectTest\WEB-INF\classes关于配置文件的目录都删掉~
3.又一次编译+clean项目之后。终于生成的配置文件位置
D:\resin-4.0.35\webapps\ProjectTest\WEB-INF\classes\ehcache\ehcache.xml
D:\resin-4.0.35\webapps\ProjectTest\WEB-INF\config\ehcache.applicationContext.xml  
D:\resin-4.0.35\webapps\ProjectTest\WEB-INF\config\springmvc-servlet.xml

注:配置文件多次提到的类路径在这里表示:classpath=D:\resin-4.0.35\webapps\ProjectTest\WEB-INF\classes

4.须要给配置的ehcache加个name属性。来标注他的唯一性
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
updateCheck="false" >
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory="1000"
eternal="false"
timeToIdleSeconds="10"
timeToLiveSeconds="10"
overflowToDisk="false"/>
<cache name="cachelist"
eternal="false"
timeToIdleSeconds="360"
timeToLiveSeconds="3600"
maxElementsInMemory="100"
overflowToDisk="false"
diskPersistent="false"
memoryStoreEvictionPolicy="LRU" />
</ehcache>

在解决这个问题时论坛中看到这么一段,貌似有朋友的问题就得到了解决,但对我没起作用~先贴下来。有时间了再学习学习

我靠,最终攻克了,原来是ehcache版本号的问题。ehcache-core2.5.0之前的版本号不会出问题。2.5.0及之后会报这个异常。我选了个ehcache-core2.4.8的好使。

<dependency>

<groupId>net.sf.ehcache</groupId>

<artifactId>ehcache-core</artifactId>

 <version>2.4.8</version>

</dependency>

看官方的文档说明:

Versions of Ehcache before version 2.5 allowed any number of CacheManagers with the same name (same configuration resource) to exist in a JVM.

Ehcache 2.5 and higher does not allow multiple CacheManagers with the same name to exist in the same JVM. CacheManager() constructors creating non-Singleton CacheManagers can violate this rule


至此,Spring 中的ehcache缓存的问题全然攻克了~


Another unnamed CacheManager already exists in the same VM的更多相关文章

  1. hibernate3与ehcache-2.8.3配合使用,在多个SessionFactory实例的情况下出现“Another unnamed CacheManager already exists in the same VM”问题

    不想看分析过程的,直接拉到最下面看第4部分 1. 问题背景 由于某些原因,项目中使用了hibernate3与ehcache-2.8.3在配合使用,又由于某些原因,需要使用多个SessionFactor ...

  2. 解决spring+shiro cacheManager 登录报错

    一.项目启动,登录报错 org.springframework.beans.factory.BeanCreationException: Error creating bean with name ' ...

  3. cacheManager载入问题

    net.sf.ehcache.CacheException: Another unnamed CacheManager already exists in the same VM. Please pr ...

  4. spring整合ehcache2.5.2缓存异常-- net.sf.ehcache.CacheException

    报错如下: The source of the existing CacheManager is: DefaultConfigurationSource [ ehcache.xml or ehcach ...

  5. 关于Springboot 中注入多个cacheManage 时候 存在报错

    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'e ...

  6. Shiro+SpringMVC 实现更安全的登录(加密匹配&登录失败超次数锁定帐号)

    原文:http://blog.csdn.net/wlwlwlwl015/article/details/48518003 前言 初学shiro,shiro提供了一系列安全相关的解决方案,根据官方的介绍 ...

  7. 一个tomcat部署多个应用实例总结

    项目组有好几个项目需要运行,之前项目少,一个tomcat对应一个项目还能应付,但现在项目多了,要是再一个tomcat对应一个项目的话,一方面看起来很业余,一方面也加大服务器的维护难度.所以现在需要对t ...

  8. ehcache hibernate4整合问题

    当在原有hibernate使用ehcache缓存的项目中加入ehcache时,报如下错误时 Caused by: org.hibernate.service.spi.ServiceException: ...

  9. SpringMVC + Mybatis + Shiro + ehcache时缓存管理器报错。

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'shiroFilter' ...

随机推荐

  1. [状态更新]MSE三个月快速复习计划,成功考上复旦软工

    最后更新,6月21日收到录取通知书啦,感谢当初不曾放弃的自己: 更新一下状态: 3.3日 分数出来了,过了复试线. 最初写这篇博客的时候,是希望自己能够每天或者至少每周更新下自己的复习状态,这样能够确 ...

  2. WINDOWS开发PHP7扩展

    最近在做个项目,需要用到唯一ID的生成,原本在Java和Delphi中,做了一个生成20位字符串(160bit)形式的唯一ID的算法,但是对比GUID(128bit),除了看起来比他短之外,其他并无优 ...

  3. [SDOI2008][luogu2463] Sandy的卡片 [kmp]

    题面 传送门 思路 这道题里面有三个主要问题: 1.由"数值相等"变成了"加上一个整数以后数值相等"(减去等价于加负数) 2.由"最多匹配多少位(从第 ...

  4. 浅谈C++三层架构

    浅谈C++三层架构 三层架构并不是MVC,MVC是一个很早就有的经典的程序设计模式,M-V-C分为三层,M(Model)-V(View)-C(Control). web开发中的三层架构是指:数据访问层 ...

  5. pdf生成

    要用本文的方法生成PDF文件,需要两个控件:itextsharp.dll和ICSharpCode.SharpZipLib.dll,由于示例代码实在太多,我将代码全部整理出来,放在另外一个文件“示例代码 ...

  6. SQL死锁

    我们操作数据库大量数据时,可能会出现死锁现象. 所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统 ...

  7. 秀秀的森林(forest)

    秀秀的森林(forest) 题目要求树上两条不相交的链,且要求权值的和最大 性质: 1.如果某棵树上的最长链端点为x,y,则该树上任意一点z出发的最长链为max(xz,zy) 2如果两个点被连进了树里 ...

  8. MFC点击控件拖动窗口

    void CMouseClickDlg::OnLButtonDown(UINT nFlags, CPoint point) { CDialogEx::OnLButtonDown(nFlags, poi ...

  9. SQLite-FMDatabase用法

    FMDatabase用法 转载 http://blog.sina.com.cn/s/blog_94d94f1a01015gcr.html 以下是FMDB的一些基本使用,FMDB框架其实只是一层很薄的封 ...

  10. SQl性能优化1

    原文发布时间为:2010-11-05 -- 来源于本人的百度文章 [由搬家工具导入] 性能优化,从上面我说的两点来考虑优化,主要是以Sql为主,平台暂不介绍,我们现在使用的数据库以SQL Server ...