另一个未命名的 CacheManager 已存在于同一虚拟机中(ehCache 2.5)

Posted

技术标签:

【中文标题】另一个未命名的 CacheManager 已存在于同一虚拟机中(ehCache 2.5)【英文标题】:Another unnamed CacheManager already exists in the same VM (ehCache 2.5) 【发布时间】:2012-04-18 06:56:17 【问题描述】:

这就是我运行 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 ]

异常背后的原因是什么。会不会有超过 1 个 cacheManager 同时运行?

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

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

我很确定我在我的代码库中只处理一个缓存管理器。其他东西可能正在运行第 n 个实例。

【问题讨论】:

我在 ehCache 2.5 或更高版本中看到了同样的问题。使用 2.4.7 不会导致这个问题,但是知道如何让 2.5 对 junit 友好会很好。 谢谢。我切换回 2.4.7 现在还可以。还有一个博客条目讨论了可能的解决方法(尽管它们似乎都不是很吸引人)norrisshelton.wordpress.com/2012/03/08/… Norris Shelton 的解决方案对我有用 (norrisshelton.wordpress.com/2012/03/08/…) 这个解决方案似乎对我不起作用,但我正在使用 testNG。我仍然得到“另一个同名 'myCacheManager' 的缓存管理器已经存在于同一个虚拟机中”:( 我相信 [这里][1] 也可以解决问题。 [1]:***.com/questions/11139653/… 【参考方案1】:

您的 EhCacheManagerFactoryBean 可能是一个单例,但它正在构建多个 CacheManager 并尝试为它们提供相同的名称。这违反了 Ehcache 2.5 semantics。

2.5 之前的 Ehcache 版本允许在一个 JVM 中存在任意数量的同名(相同配置资源)的 CacheManager。

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

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

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

【讨论】:

需要注意的是,如果 Spring 自动代理 EhCacheManagerFatoryBean,即使您将 p:shared 设置为 true,您仍然可能会收到错误消息。解决此问题的方法不是使用文件的默认名称,而是使用 ehcache.xml 重命名文件并将 p:config-location 添加到 EhCacheManagerFactoryBean 声明中并使用新文件名。 @TechTrip:我确实做到了:我的 EhCacheManagerFactoryBean 上有 p:config-location="classpath:ehcache-foo.xml" p:shared="true",但我遇到了冲突,因为我的 JVM 上的两个 WAR 使用了同一个模块。 如果我错了,请纠正我,但这是否意味着第二次测试将重用第一次测试中的缓存,其中仍有任何缓存数据?这可能会导致难以调试行为,因为第二个测试不是以众所周知的状态开始的。测试结果可能取决于测试顺序。 (当然,黑盒测试不应该取决于是否使用缓存,但是根据缓存状态进行性能测试或者您正在测试自己的缓存实用程序(在后台使用 ehcache)是完全有效的。) 【参考方案2】:

我在使用 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"/>

【讨论】:

我调整了这个解决方案来解决我的 Spring Boot 测试问题:我使用了org.hibernate.cache.ehcache.EhCacheRegionFactory instead of net.sf.ehcache.hibernate.EhCacheRegionFactory for Hibernate 4。使用 Spring Boot,您可以在 application.properties 中进行设置:spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory 或者如果要将配置限制为测试。 哇,从 hibernate 4.3.x 升级到 5.2 后节省了我的一天。【参考方案3】:

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

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

【讨论】:

这完全解决了测试环境的问题,而无需更改您的实际运行时配置。不错! forkmode=always 是一个很好的选择,但已被弃用。请参阅:maven.apache.org/surefire/maven-surefire-plugin/examples/…TRY forkCount=1(默认),reuseForks=false【参考方案4】:

升级到 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"/>

请注意,这些软件包彼此不同。

【讨论】:

【参考方案5】:

您也可以尝试在 ehcache.xml 配置(在 ehcache 元素上)设置名称“xxx”。

这对我有用,因为我认为我的应用程序的一个模块中潜伏着另一个缓存配置。

共享解决方案也有效,但我不知道它的广泛影响。

http://forums.terracotta.org/forums/posts/list/6495.page https://norrisshelton.wordpress.com/2012/03/08/spring-3-1-caching-abstraction-with-ehcache/

【讨论】:

是的!事实证明,这对我来说是唯一的解决方案。将 name 属性添加到顶部 echache 元素。这似乎没有记录在示例 ehcache.xml 文件中.. 太遗憾了,我在这里只阅读了第一个答案,之后我回到 eclipse 中阅读所有 spring 和 ehcache 初始化源以确定需要 name 属性,否则配置文件将被忽略。 .. 很好的解决方案,我在两个碰巧都使用 ehcache 的不同模块中的两个单元测试中遇到了相同的异常,每个模块都有自己的文件,这解决了问题 优秀。但我仍然无法理解如何通过将名称放入 ehcache.xml 来解决问题?我正在使用 spring 缓存 + hibernate 二级缓存。两者都使用相同的 ehcache.xml。 此解决方案仅适用于冲突配置(多个 ehcache.xml 文件),如果您只使用一个,则可能是另一个问题。【参考方案6】:

为了后代:更好的方法是使用EhCacheManagerFactoryBean 的“接受现有”属性。

【讨论】:

【参考方案7】:

如果你只是测试你的业务服务,而不是二级缓存,你可以在你的spring配置文件中删除二级配置,你的测试就会成功运行。还有我的二级配置:

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

如果我更改为二级缓存配置的完整配置,真正的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 中”

【讨论】:

【参考方案8】:

在我的例子中,我们有一个定义为 bean 的自定义缓存管理器。 也是一个自定义应用程序上下文,所以我们不使用 spring junit runner...因此 @DirtiesContext 不起作用。

诀窍是从 bean 中检索缓存实例,在该缓存上获取 cacheManager(来自 EHCache 的实例)。并在该缓存管理器上调用 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;

【讨论】:

【参考方案9】:

我通过在 resources.groovy 中添加以下内容来解决它:

豆子 = ... aclCacheManager(EhCacheManagerFactoryBean) 共享 = 真 ...

【讨论】:

【参考方案10】:

切换到 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>

【讨论】:

【参考方案11】:

EhCacheManagerFactoryBean#shared 设置为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;
    

如Using EhCache in Spring 4 without XML中所述

【讨论】:

【参考方案12】:

对于未来的读者来说,这个问题的原因是在我的 pom.xml 文件中我导入了 hibernate-ehcache 库,我不知道它也已经包含了 ehcache 库,然后显式导入了网络。 sf.ehache 库。

当我作为独立应用程序(例如命令行实用程序)运行时,这似乎工作正常,但在 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 容器中运行时才会出现问题,我很想知道..

【讨论】:

【参考方案13】:

在 glassfish 3.0.1 中,我将问题追溯到 IniShiroFilter 两次初始化,这发生在服务器启动后立即触发并发请求时。以下是对应于两个 HTTP 请求的两个不同线程的堆栈跟踪:

[#|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 期间初始化过滤器。

【讨论】:

【参考方案14】:

在我的情况下,问题是组件扫描和 java 配置。

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

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

spring 组件扫描对 xml 文件工作两次。 它每次运行时都会在 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>

【讨论】:

【参考方案15】:

错误的映射文件也会发生此错误。消息很可怕,没有说明原因。

【讨论】:

【参考方案16】:

在我的情况下配置如下:

<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

【讨论】:

【参考方案17】:

Spring Boot 2.1.2 开始,以下配置可以解决该问题。 (注意,这些是整体配置的 sn-ps。)

依赖关系:

<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 配置:

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>

我正在处理的应用程序在没有工作缓存的情况下会急剧变慢。因此,为了验证,我只是运行了应用程序并点击了读取密集的端点之一。

【讨论】:

【参考方案18】:

在我的例子中,Manager 是由这个 bean 创建的(ehCache 2.10):

  <bean id="ehcache"
        class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
    <property name="shared" value="false"/>
  </bean>

对我有用的唯一解决方案是以这种方式手动销毁它:

@Inject
private EhCacheManagerFactoryBean ehCacheManagerFactoryBean;

然后

ehCacheManagerFactoryBean.destroy();

【讨论】:

以上是关于另一个未命名的 CacheManager 已存在于同一虚拟机中(ehCache 2.5)的主要内容,如果未能解决你的问题,请参考以下文章

Apache Shiro EhCache 初始化异常:另一个未命名的 CacheManager 已存在于同一个 VM 中

grails 2.5:使用多个数据源时,“另一个未命名的 CacheManager 已存在于同一 VM 中”

列出存在于另一个模型中的所有关联模型记录,该模型存在于 rails 中的另一个命名空间中

删除存在于另一个命名空间 rails 中的模型

检查日期是不是已存在于另一个时间段中

如何查找已动态创建且存在于另一个元素中的选择下拉列表的值和 ID