当前位置: 首页 > 知识库问答 >
问题:

同一个VM中已存在另一个未命名的CacheManager(ehCache 2.5)

安浩瀚
2023-03-14

这就是我运行junit测试时发生的情况。。。

Another CacheManager with same name '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: 
 DefaultConfigurationSource [ ehcache.xml or ehcache-failsafe.xml ]

这一例外背后的原因是什么。是否有多个cacheManager同时运行?

这就是我使用Sping 3.1.1配置cachManager的方式。它明确地将cacheManager的范围设置为“singleton”

<ehcache:annotation-driven />

<bean
    id="cacheManager"
    class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
    scope="singleton"
    />

电子缓存。xml看起来像

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
     updateCheck="false"
     maxBytesLocalHeap="100M" 
     name="cacheManager"
     >
 ....
 </ehcache>

终于上我的课了

@Component
public class BookingCache implements CacheWrapper<String, BookingUIBean> {

     @Autowired
     private CacheManager ehCacheManager;
      ....
}

我非常确定我的代码库中只有一个cacheManager。其他东西可能正在运行第n个实例。

共有3个答案

呼延河
2023-03-14

您的问题是在Spring测试框架中构建的上下文加载优化。Spring(默认情况下)不会在测试类完成后破坏上下文,希望其他测试类可以重用它(而不是从头开始创建)。

您可以使用@DirtiesContext覆盖此默认值,或者如果使用maven,则可以将surefire forkMode设置为“始终”,并为每个测试类创建一个新的VM。

齐阳
2023-03-14

我在使用JPA(2.0)、Hibernate(3.6.4)和Spring(3.2.4)进行集成测试时也遇到了同样的问题。使用以下Hibernate配置解决了该问题:

<property name="hibernate.cache.region.factory_class" value="net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory"/>

而不是用

<property name="hibernate.cache.region.factory_class" value="net.sf.ehcache.hibernate.EhCacheRegionFactory"/>
怀飞扬
2023-03-14

您的EhCacheManagerFactoryBean可能是一个单例,但它正在构建多个CacheManager并试图给它们相同的名称。这违反了Ehache2.5语义学。

2.5版之前的Ehacache版本允许在JVM中存在任意数量的具有相同名称(相同配置资源)的CacheManager。

Ehcache 2.5及更高版本不允许同一JVM中存在多个同名的CacheManager。CacheManager()构造函数创建非单例CacheManager可能会违反此规则

通过将shared属性设置为true,告诉工厂bean在JVM中创建CacheManager的共享实例。

<bean id="cacheManager"
      class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
      p:shared="true"/>
 类似资料: