web-dev-qa-db-ja.com

別の名前のないCacheManagerが同じVM(ehCache 2.5)に既に存在します

これは、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のスコープを明示的に「シングルトン」に設定します

<ehcache:annotation-driven />

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

Ehcache.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を1つだけ処理していると確信しています。他の何かがおそらくn番目のインスタンスを実行しています。

72
simou

EhCacheManagerFactoryBeanはシングルトンかもしれませんが、複数のCacheManagerを構築し、それらに同じ名前を付けようとしています。これはEhcache 2.5に違反しています semantics

バージョン2.5より前のEhcacheのバージョンでは、JVMに同じ名前(同じ構成リソース)のCacheManagerをいくつでも存在させることができました。

Ehcache 2.5以降では、同じ名前の複数のCacheManagerを同じJVMに存在させることはできません。シングルトン以外のCacheManagersを作成するCacheManager()コンストラクターは、このルールに違反する可能性があります

shared プロパティをtrueに設定して、JVMでCacheManagerの共有インスタンスを作成するようファクトリBeanに指示します。

<bean id="cacheManager"
      class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
      p:shared="true"/>
44

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"/>
40
Felix Reckers

問題は、Springテストフレームワークに組み込まれたコンテキストロードの最適化です。 Spring(デフォルト)は、テストクラスが完了するとコンテキストを破棄しません。別のテストクラスが(最初から作成する代わりに)それを再利用できることを期待しています。

@DirtiesContextを使用してこのデフォルトをオーバーライドできます。mavenを使用する場合は、surefire forkModeを「always」に設定し、テストクラスごとに新しいVMを作成できます。

21
Dejan P

また、ehcache.xml構成(ehcache要素)にname "xxx"を設定することもできます。

私のアプリのモジュールの1つに別のキャッシュ構成が潜んでいると思うので、それは私にとってトリックでした。

共有ソリューションも機能しますが、その広範囲にわたる影響はわかりません。

12
Michael Holst

Hibernate 5にアップグレードした後、次を使用する必要がありました。

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

の代わりに:

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

別のパッケージではありません。

9
eyes

後世:より良い方法は、 EhCacheManagerFactoryBean の "accept-existing"プロパティを使用することです。

6
Nishith

私の場合、Beanとして定義されたカスタムキャッシュマネージャーがあります。また、カスタムアプリケーションコンテキストなので、spring junitランナーを使用しません...したがって、@ DirtiesContextは機能しません。

トリックは、Beanからキャッシュインスタンスを取得し、そのキャッシュでcacheManager(EHCacheからのインスタンス)を取得することです。そして、そのcachemanagerでremoveCacheメソッドを呼び出します。

@Afterアノテーションが付けられたメソッドにこれを配置すると、各テストの後にVMからキャッシュが削除されます。次のようになります。

@After
public void destroy() {
    MyCustomCacheManager customCacheManager = (MyCustomCacheManager) context.getBean("yourCustomCacheManagerBean");

    try {
        net.sf.ehcache.Cache cache = customCacheManager.getCache();
        net.sf.ehcache.CacheManager cacheManager = cache.getCacheManager();
        cacheManager.removeCache("nameOfYourCache");
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }

    context.destroy();
    context = null;
}
2
Pim Hazebroek

Spring Boot 2.0.2に切り替えたとき、私に起こりました。以下を実行して解決しました。

application.ymlで削除

spring.jpa.properties.hibernate.cache.region.factory_class: org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory

pom.xmlで削除

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

pom.xmlでのみ保持

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-ehcache</artifactId>
</dependency>
2
Ronny Shibley

Resources.groovyに以下を追加して解決しました。

beans = {... aclCacheManager(EhCacheManagerFactoryBean){shared = true} ...}

2
Dasma

セカンドレベルキャッシュではなく、ビジネスサービスをテストするだけであれば、spring configファイルのセカンドレベル設定を削除できます。テストは正常に実行されます。私の第2レベルの構成があります:

 <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="persistenceUnitName" value="defaultPU" />
        <property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter" />
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                <prop key="hibernate.show_sql">false</prop>
                <!-- <prop key="hibernate.hbm2ddl.auto">update</prop> -->
                <prop key="hibernate.cache.use_second_level_cache">false</prop>
                <prop key="hibernate.cache.use_query_cache">false</prop>
            </props>
        </property>
    </bean>

次のように、2番目のレベルのキャッシュ構成の完全な構成に変更すると、実行時に実際のwebappが使用します。

    <bean id="entityManagerFactory"
            class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
            <property name="dataSource" ref="dataSource" />
            <property name="persistenceUnitName" value="defaultPU" />
            <property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter" />
            <property name="jpaProperties">
                <props>
                    <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                    <prop key="hibernate.show_sql">false</prop>
                    <!-- <prop key="hibernate.hbm2ddl.auto">update</prop> -->
                    <prop key="hibernate.cache.use_second_level_cache">true</prop>
                    <prop key="hibernate.cache.use_query_cache">true</prop>
                    <prop key="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.EhCacheRegionFactory</prop>               
                    <prop key="net.sf.ehcache.configurationResourceName">ehcache/ehcache-hibernate-local.xml</prop>
                </props>
            </property>
        </bean>

その後、同じ例外が発生します。「別の名前のないCacheManagerが同じVMに既に存在します」

2
roger.li

将来の読者のために、私の場合のこの問題の原因は、pom.xmlファイルでhibernate-ehcacheライブラリをインポートしたことでした。ライブラリー。

スタンドアロンアプリ(たとえば、コマンドラインユーティリティ)として実行している場合、これは正常に動作するように見えましたが、Tomcatサーバーで実行する場合、元の投稿でエラーが発生しました。

私のPOMファイルを次から変更します:

        <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>

に:

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

問題を修正しました。 Tomcatコンテナで実行している場合にのみ問題が発生する理由が誰にもわからない場合は、興味があります。

1
Matt Watson

EhCacheManagerFactoryBean#shared to trueは私のために働いた。

EhCacheManagerFactoryBean#acceptExistingからtrueは私には役に立たなかった。

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;
    }
}

XMLなしでSpring 4でEhCacheを使用する で説明されているように

1
Mate Šimović

Spring Boot 2.1.2の時点で、次の構成で問題が解決しました。 (注意、これらは全体的な設定のスニペットです。)

依存関係:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-core</artifactId>
  <version>5.2.8.Final</version>
</dependency>
<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-ehcache</artifactId>
  <version>5.2.8.Final</version>
</dependency>

application.yml config:

spring:
  jpa:
    open-in-view: false
    hibernate:
      ddl-auto: none
    show-sql: true
    properties:
      dialect: org.hibernate.dialect.MySQLDialect
      net:
        sf:
          ehcache:
            configurationResourceName: ehcache.xml
      hibernate:
        cache:
          use_second_level_cache: true
          region:
            factory_class: org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory

ehcache.xml設定:

<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
  <!-- Required elements -->
  <diskStore path="Java.io.tmpdir"/>
  <defaultCache
    maxElementsInMemory="10000"
    eternal="false"
    timeToIdleSeconds="120"
    timeToLiveSeconds="120"
    overflowToDisk="true"/>

  <!-- Cache settings per class -->
  <cache name="com.mystuff.component.services.example.Book"
    maxElementsInMemory="1000"
    eternal="false"
    timeToIdleSeconds="300"
    timeToLiveSeconds="600"
    overflowToDisk="true"/>
</ehcache>

私が作業しているアプリケーションは、作業キャッシュなしで大幅に遅くなります。そのため、検証するには、単にアプリケーションを実行して、読み取り集中エンドポイントの1つにヒットしました。

0
kroolk

Glassfish 3.0.1では、IniShiroFilterが2回初期化される問題をトレースしました。これは、サーバーの起動直後に同時リクエストが発生したときに発生します。以下は、2つのHTTP要求に対応する2つの異なるスレッドからのスタックトレースです。

[#|2012-11-28T08:25:10.630-0800|SEVERE|glassfish3.0.1|javax.enterprise.system.std.com.Sun.enterprise.v3.services.impl|_ThreadID=28;_ThreadName=Thread-1;|Java.lang.Exception: Stack trace
        at Java.lang.Thread.dumpStack(Thread.Java:1249)
        at org.Apache.shiro.web.servlet.IniShiroFilter.<init>(IniShiroFilter.Java:124)
        at Sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at Sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.Java:39)
        at Sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.Java:27)
        at Java.lang.reflect.Constructor.newInstance(Constructor.Java:513)
        at com.Sun.enterprise.container.common.impl.util.InjectionManagerImpl.createManagedObject(InjectionManagerImpl.Java:303)
        at com.Sun.enterprise.web.WebContainer.createFilterInstance(WebContainer.Java:725)
        at com.Sun.enterprise.web.WebModule.createFilterInstance(WebModule.Java:1948)
        at org.Apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.Java:248)
        at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:237)
        at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:215)
        at com.sentilla.filter.DumpFilter.doFilter(DumpFilter.Java:152)
        at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:256)
        at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:215)
        at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:277)
        at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:188)
        at org.Apache.catalina.core.StandardPipeline.invoke(StandardPipeline.Java:641)
        at com.Sun.enterprise.web.WebPipeline.invoke(WebPipeline.Java:97)
        at com.Sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.Java:85)
        at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:185)
        at org.Apache.catalina.core.StandardPipeline.invoke(StandardPipeline.Java:641)
        at org.Apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.Java:322)
        at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:226)
        at com.Sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.Java:239)
        at com.Sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.Java:791)
        at com.Sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.Java:693)
        at com.Sun.grizzly.http.ProcessorTask.process(ProcessorTask.Java:954)
        at com.Sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.Java:170)
        at com.Sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.Java:135)
        at com.Sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.Java:102)
        at com.Sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.Java:88)
        at com.Sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.Java:76)
        at com.Sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.Java:53)
        at com.Sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.Java:57)
        at com.Sun.grizzly.ContextTask.run(ContextTask.Java:69)
        at com.Sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.Java:330)
        at com.Sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.Java:309)
        at Java.lang.Thread.run(Thread.Java:662)

別のスレッド

[#|2012-11-28T08:25:15.299-0800|SEVERE|glassfish3.0.1|javax.enterprise.system.std.com.Sun.enterprise.v3.services.impl|_ThreadID=29;_ThreadName=Thread-1;|Java.lang.Exception: Stack trace
        at Java.lang.Thread.dumpStack(Thread.Java:1249)
        at org.Apache.shiro.web.servlet.IniShiroFilter.<init>(IniShiroFilter.Java:124)
        at Sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at Sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.Java:39)
        at Sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.Java:27)
        at Java.lang.reflect.Constructor.newInstance(Constructor.Java:513)
        at com.Sun.enterprise.container.common.impl.util.InjectionManagerImpl.createManagedObject(InjectionManagerImpl.Java:303)
        at com.Sun.enterprise.web.WebContainer.createFilterInstance(WebContainer.Java:725)
        at com.Sun.enterprise.web.WebModule.createFilterInstance(WebModule.Java:1948)
        at org.Apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.Java:248)
        at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:237)
        at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:215)
        at com.sentilla.filter.DumpFilter.doFilter(DumpFilter.Java:152)
        at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:256)
        at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:215)
        at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:277)
        at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:188)
        at org.Apache.catalina.core.StandardPipeline.invoke(StandardPipeline.Java:641)
        at com.Sun.enterprise.web.WebPipeline.invoke(WebPipeline.Java:97)
        at com.Sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.Java:85)
        at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:185)
        at org.Apache.catalina.core.StandardPipeline.invoke(StandardPipeline.Java:641)
        at org.Apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.Java:322)
        at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:226)
        at com.Sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.Java:239)
        at com.Sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.Java:791)
        at com.Sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.Java:693)
        at com.Sun.grizzly.http.ProcessorTask.process(ProcessorTask.Java:954)
        at com.Sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.Java:170)
        at com.Sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.Java:135)
        at com.Sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.Java:102)
        at com.Sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.Java:88)
        at com.Sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.Java:76)
        at com.Sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.Java:53)
        at com.Sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.Java:57)
        at com.Sun.grizzly.ContextTask.run(ContextTask.Java:69)
        at com.Sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.Java:330)
        at com.Sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.Java:309)
        at Java.lang.Thread.run(Thread.Java:662)

スタックトレースApplicationFilterConfig.Java:248を見ることが原因である可能性があります。または、glassfishは間違ったコンテキストでフィルターを初期化しています。比較のために、TomcatはBootStrap中にフィルターを初期化します。

0
jsh

このエラーは、間違ったマッピングファイルでも発生します。メッセージは恐ろしく、原因を言っていません。

0
ejaenv

私の場合、問題はコンポーネントのスキャンとJava config。

root-context.xml
<context:component-scan base-package="org.beansugar">

servlet-context.xml
<context:component-scan base-package="org.beansugar">

springコンポーネントスキャンは、xmlファイルで2回動作します。 SpringConfig.Java内で実行時にBeanを生成します。その後、重複したキャッシュマネージャーが作成されました。

それで、以下のように変更しました。

root-context.xml
<context:component-scan base-package="org.beansugar">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

servlet-context.xml
<context:component-scan base-package="org.beansugar" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
0
archmagece

私の場合、構成は次のとおりでした。

<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>

EHCacheプロバイダークラスを変更することで、仕事ができました。キャッシュプロバイダークラスをorg.hibernate.cache.EhCacheProviderとして使用していましたが、代わりにnet.sf.ehcache.hibernate.SingletonEhCacheProviderに変更しました

0
Ritesh