merveotesi
merveotesi

Reputation: 2193

EhCache CacheManager with multiple EntityManagerFactory

And one entityManagerFactory in spring-server.xml.

But i must generate one more entityManager, and i do it with

Persistence.createEntityManagerFactory("myotherpersistenceunitname");

but i get exception

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: DefaultConfigurationSource [ ehcache.xml or ehcache-failsafe.xml ]
    at net.sf.ehcache.CacheManager.assertNoCacheManagerExistsWithSameName(CacheManager.java:457)
    at net.sf.ehcache.CacheManager.init(CacheManager.java:354)
    at net.sf.ehcache.CacheManager.<init>(CacheManager.java:242)
    at net.sf.ehcache.hibernate.EhCacheRegionFactory.start(EhCacheRegionFactory.java:70)

spring.xml:

<context:property-placeholder location="classpath:application.properties"/>
    <context:component-scan base-package="merve.web.app" >
     <context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation" />
    </context:component-scan>
    <context:annotation-config/>
    <tx:annotation-driven transaction-manager="txManager" proxy-target-class="true"  />

    <cache:annotation-driven />


    <bean id="properties" class="merve.web.app.configuration.PropertyResourceConfiguration" />

    <bean id="entityManagerFactory"  
          class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">  
         <property name="persistenceUnitName" value="myPU"/>  
         <property name="dataSource" ref="dataSource" />  
         <property name="jpaVendorAdapter">  
             <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">  
                 <property name="databasePlatform" value="${database.target}"/>  
                 <property name="showSql" value="${database.showSql}" />  
             </bean>
         </property>  
    </bean>  

    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${database.driver}"/>
        <property name="jdbcUrl" value="${database.url}"/>
        <property name="user" value="${database.username}"/>
        <property name="password" value="${database.password}"/>
        <property name="minPoolSize" value="2"/>
        <property name="maxPoolSize" value="10"/>
        <property name="breakAfterAcquireFailure" value="false"/>
        <property name="acquireRetryAttempts" value="3"/>
        <property name="idleConnectionTestPeriod" value="300" />
        <property name="testConnectionOnCheckout" value="true" />
    </bean>


    <bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>



    <bean id="jamesEntityManagerFactory"  
          class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">  
         <property name="persistenceUnitName" value="jamesPU"/>  
         <property name="dataSource" ref="dataSourceJames" />
         <property name="persistenceXmlLocation" value="classpath:META-INF/james-persistence.xml"/> 
         <property name="jpaVendorAdapter">  
             <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">  
                 <property name="databasePlatform" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>  
                 <property name="showSql" value="true" />  
             </bean>
         </property>   
    </bean>  



    <bean id="dataSourceJames" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="org.apache.derby.jdbc.EmbeddedDriver"/>
        <property name="jdbcUrl" value="jdbc:derby:../var/store/derby;create=true"/>
        <property name="user" value="app"/>
        <property name="password" value="app"/>
        <property name="minPoolSize" value="2"/>
        <property name="maxPoolSize" value="10"/>
        <property name="breakAfterAcquireFailure" value="false"/>
        <property name="acquireRetryAttempts" value="3"/>
        <property name="idleConnectionTestPeriod" value="300" />
        <property name="testConnectionOnCheckout" value="true" />
    </bean>

    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />


     <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">  
        <property name="basenames">  
            <list>
                <value>messages</value>
            </list>
        </property>
    </bean>

    <!-- Ehcache library setup -->
    <bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" p:shared="true" p:config-location="classpath:ehcache.xml"/>

    <bean id="cacheManager"   class="org.springframework.cache.ehcache.EhCacheCacheManager" >
     <property name="cacheManager"><ref local="ehcache"></ref></property>  
    </bean>

<dwr:configuration/>
    <dwr:annotation-scan base-package="tuxi.web.app.service.dwr" scanRemoteProxy="true" scanDataTransferObject="true"/>
    <dwr:url-mapping />

    <dwr:controller id="dwrController"/>

</beans>

Upvotes: 2

Views: 6331

Answers (2)

MariuszS
MariuszS

Reputation: 31585

Try naming both cacheManagers differently in ehcache.xml

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    name="ehCacheManager1">

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    name="ehCacheManager2">

Upvotes: 0

JJ Zabkar
JJ Zabkar

Reputation: 3699

The problem, described here, and fixed in the source is not using the EhCache singleton correctly. The answer depends on which version of spring-context-support AND which version of EhCache you are using. For both, you need to be using EhCache 2.6 or greater:

<dependency>
    <groupId>net.sf.ehcache</groupId>
    <artifactId>ehcache</artifactId>
    <version>2.6.0</version>
</dependency>

Next, determine what to do based on your spring-context-support version:

If using Spring 3.1/3.2

<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
    p:shared="true" 
    p:config-location="classpath:ehcache.xml"/>

If using Spring 4.x

<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
    p:shared="false"
    P:acceptExisting="true" 
    p:config-location="classpath:ehcache.xml"/>

Upvotes: 2

Related Questions