Another unnamed CacheManager already exists in the same VM
2017-07-26 20:21
561 查看
今天学习Spring 缓存机制。遇到不少问题~
好不easy缓存的单元測试用例调试成功了,在同一项目下单元測试另外一个文件时,发生了异常:
最后发现原因:
因为项目下有三个配置文件。都放在同一文件夹下:
在另个单元測试用例中实例化Spring容器的时候,全部的配置文件都载入进去了
解决的方法:将缓存的配置文件和其它的配置文件放在不同包下
1.缓存測试用例中。实例化容器时,仅仅读缓存相关的配置文件;
最后贴一段实现缓存的单元測试用例,机器配置文件
配置文件路径:/project/src/test/resources/ehcache
ehcache.xml
ehcache.applicationContext.xml
DirectcityCacheTest.java
结果:
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属性。来标注他的唯一性
在解决这个问题时论坛中看到这么一段,貌似有朋友的问题就得到了解决,但对我没起作用~先贴下来。有时间了再学习学习
我靠,最终攻克了,原来是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缓存的问题全然攻克了~
好不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
- Hibernate 异常CacheException: Another unnamed CacheManager already exists in the same VM
- Another unnamed CacheManager already exists in the same VM.解决方法
- 在整合springmvc+mybatis+ecache时候报错如下: Another unnamed CacheManager already exists in the same VM.
- Another unnamed CacheManager already exists in the same VM
- net.sf.ehcache.CacheException: Another unnamedCacheManager already exists in the same VM
- Another unnamed CacheManager already exists in the same VM.解决方法
- Another unnamed CacheManager already exists in the same VM (ehCache 2.5) 解决办法
- net.sf.ehcache.CacheException: Another unnamed CacheManager already exists in the same VM.
- Ehcache配置时出错- Another unnamed CacheManager already exists in the same VM. Please provide unique name
- SpringBoot--P-1:缓存 Another unnamed CacheManager already exists in the same VM.
- hibernate3与ehcache-2.8.3配合使用,在多个SessionFactory实例的情况下出现“Another unnamed CacheManager already exists in the same VM”问题
- Ehcache依赖版本问题:Another CacheManager with same name 'es' already exists in the same VM.
- Excel导入遇到的问题An object with the same key already exists in the ObjectStateManager……
- Socket file /var/lib/mysql/mysql.sock exists. Is another MySQL daemon already running with the same
- Socket file /tmp/mysql.sock exists. Is another MySQL daemon already running with the same unix socke
- ES报错:Can not be imported as a dangling index as index with same name already exists in cluster me
- svn 如果遇到an unversioned directory of the same name already exists的解决办法
- InnoDB: 2 of name './banggood201401/ana_tmp_sku.ibd' already exists in the tablespace
- Another MySQL daemon already running with the same unix socket