Another unnamed CacheManager already exists in the same VM (ehCache 2.5)

前端 未结 17 1935
囚心锁ツ
囚心锁ツ 2020-11-30 20:41

This is what happens when I run my junit tests...

Another CacheManager with same name \'cacheManager\' already exists in the same VM. Please 
provide unique          


        
相关标签:
17条回答
  • 2020-11-30 21:20

    Your EhCacheManagerFactoryBean may be a singleton, but it's building multiple CacheManagers and trying to give them the same name. That violates Ehcache 2.5 semantics.

    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

    Tell the factory bean to created a shared instance of the CacheManager in the JVM by setting the shared property to true.

    <bean id="cacheManager"
          class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
          p:shared="true"/>
    
    0 讨论(0)
  • 2020-11-30 21:21

    For posterity: A better way is to use the "accept-existing" property of the EhCacheManagerFactoryBean.

    0 讨论(0)
  • 2020-11-30 21:21

    Setting the EhCacheManagerFactoryBean#shared to true worked for me.

    Setting the EhCacheManagerFactoryBean#acceptExisting to true DIDN'T work for me.

    import org.springframework.cache.ehcache.EhCacheCacheManager;
    import org.springframework.cache.ehcache.EhCacheManagerFactoryBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.core.io.ClassPathResource;
    
    @Configuration
    public class EhCacheConfiguration {
    
        @Bean
        public EhCacheCacheManager ehCacheCacheManager() {
    
            return new EhCacheCacheManager(ehCacheManagerFactoryBean().getObject());
        }
    
    
        @Bean
        public EhCacheManagerFactoryBean ehCacheManagerFactoryBean() {
    
            EhCacheManagerFactoryBean cacheManagerFactoryBean = new EhCacheManagerFactoryBean();
    
            cacheManagerFactoryBean.setConfigLocation(new ClassPathResource("ehcache.xml"));
            cacheManagerFactoryBean.setShared(true);
    
            return cacheManagerFactoryBean;
        }
    }
    

    As explained in Using EhCache in Spring 4 without XML

    0 讨论(0)
  • 2020-11-30 21:22

    For future readers, the cause of this problem in my case was that in my pom.xml file I had imported the hibernate-ehcache library, which unknown to me also already contained the ehcache library, and then explicitly imported the net.sf.ehache libray.

    This seemed to work fine when I was running as a standalone app (a command line utility for example) but it caused the error in the original post when running on a tomcat server.

    Changing my pom file from:

            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-ehcache</artifactId>
                <version>5.0.2.Final</version>
            </dependency>
            <dependency>
                <groupId>net.sf.ehcache</groupId>
                <artifactId>ehcache</artifactId>
                <version>2.7.4</version>
            </dependency>
    

    To:

            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-ehcache</artifactId>
                <version>5.0.2.Final</version>
            </dependency>
            <!-- ehcache dependency removed -->
    

    Fixed the problem. If anyone has any idea why the problem only appeared when running in a tomcat container I'd be interested to know..

    0 讨论(0)
  • 2020-11-30 21:25

    In my case configuration was as follows:

    <spring.boot.version>1.5.8.RELEASE</spring.boot.version>
    <spring.boot.yarn.version>2.4.0.RELEASE</spring.boot.yarn.version>
    <spring.version>4.3.7.RELEASE</spring.version>
    
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-core</artifactId>
      <version>3.5.1-Final</version>
    </dependency>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-ehcache</artifactId>
      <version>3.5.1-Final</version>
    </dependency>
    

    Changing the EHCache provider class did the job for me. I was using cache provider class as org.hibernate.cache.EhCacheProvider instead i changed this to: net.sf.ehcache.hibernate.SingletonEhCacheProvider

    0 讨论(0)
提交回复
热议问题