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

应用程序启动时,同一VM中已存在另一个名为“”的CacheManager

谭毅然
2023-03-14
net.sf.ehcache.CacheException: Another CacheManager with same name 'fernowebapp' already exists in the same VM. Please provide unique names for each CacheManage
r 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.

这是网络。xml

 <servlet>
    <servlet-name>ferno</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
<!--         <load-on-startup>1</load-on-startup> -->
</servlet>
<servlet-mapping>
    <servlet-name>ferno</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/ferno-servlet.xml</param-value>
</context-param>
<context-param>
    <param-name>contextInitializerClasses</param-name>
    <param-value>com.vuelogix.collygo.context.FernoApplicationContextInitializer</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

当我检查日志时,我发现应用程序上下文被初始化了两次。我只是通过禁用dispatcher servlet的启动加载来验证它。当我禁用dispatcher servlet时,我发现异常不会在启动时出现。但它发生在我第一次尝试攻击任何控制器类时。

我在为什么Spring MVC需要至少两个上下文中发现了一些类似的问题?

在下面的链接中提到,对于Ehache2.5及更高版本,不允许同一JVM中存在具有相同名称的多个CacheManager。创建非单例CacheManager的CacheManager()构造函数可能违反此规则。

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

如果要再次加载应用程序上下文以初始化dispatcher servlet,那么初始化CacheManager之类的类的最佳方法是什么?

我相信如果我为调度服务器servlet添加初始化参数,它会起作用。在我的情况下,我没有调度服务器servlet的单独应用程序上下文,所以我相信它在我的应用程序上下文中工作正常。更新:所以,当我真的需要一个单独的应用程序上下文为我的调度服务器servlet时,最佳实践是从第二个上下文中删除缓存声明(在这种情况下),并在根配置上进行这些配置?如果我错了,请纠正我

共有1个答案

秦博延
2023-03-14

您几乎已经找到了为什么Spring MVC需要至少两个上下文?问题的答案。

当您使用Spring MVC时,您有根上下文和使用根作为其父级的调度器servlet上下文。

但是这里有:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/ferno-servlet.xml</param-value>
</context-param>

您声明根上下文应该从/WEB-INF/ferno servlet加载。xml,当您将servlet命名为ferno时,DispatcherServlet上下文从同一个文件加载。然后在每个上下文中创建每个bean两次一次——这至少是危险的。。。

所以你必须声明2个上下文和:

  • 要么

永远不要使用像xxx servlet这样的名称。用于根应用程序上下文的xml,以避免此类问题。

 类似资料:
  • 这就是我运行junit测试时发生的情况。。。 这一例外背后的原因是什么。是否有多个cacheManager同时运行? 这就是我使用Sping 3.1.1配置cachManager的方式。它明确地将cacheManager的范围设置为“singleton” 电子缓存。xml看起来像 终于上我的课了 我非常确定我的代码库中只有一个cacheManager。其他东西可能正在运行第n个实例。

  • 似乎有另一个进程正在加载缓存,但无法定位这个(如果错误没有告诉我谎言)。它唯一告诉我的是,我有另一个缓存从一个名为InputStreamConfigurationSource的类开始??? 有人遇到过这个错误吗??? 我在用 Spring3 泽西1.6/1.7 ehCache 2.6 StackTrace Spring配置 网页xml 缓存文件 文件服务类 JSONendpoint

  • 我正在尝试将EhCache配置为在启用Apache Shiro的Web服务中处理授权缓存。目前我得到了以下例外: org.apache.shiro.cache.CacheException:net.sf.ehcache.CacheException:同一VM中已存在另一个未命名的CacheManager。请为配置中的每个CacheManager提供唯一名称,或执行以下操作之一: 使用CacheMa

  • 问题内容: 我需要从另一个“容器”类启动一个Javafx应用程序,并在该应用程序上调用函数,但是似乎没有任何方法可以使用Application.launch()方法来获取对该应用程序的引用。这可能吗?谢谢 问题答案: 我遇到了同样的问题,并使用此hack解决了这个问题: 然后是您要从中启动应用程序的类: 希望对您有帮助。

  • 我们有一个公开REST API的现有java应用程序。当它收到超文本传输协议请求时,它使用Runtime.getRuntime(). exe启动另一个java进程。 我们正在将此应用程序迁移到docker,我们希望将这些服务、一个容器中的REST应用程序和另一个容器中的其他组件分开。 有没有办法,REST应用程序可以在另一个docker容器中启动另一个应用程序?

  • 问题内容: 我有两个单独的节点应用程序。我希望其中一个能够在代码中的某个时刻启动另一个。我将如何去做? 问题答案: 使用。它与相似,但是用于创建V8的全新实例。因此,它专门用于运行Node的新实例。如果您只是执行命令,请使用或。 请注意,默认情况下使用时,流与父级关联。这意味着所有输出和错误都将在父进程中显示。如果您不希望与父级共享流,则可以在选项中定义属性: 然后,您可以将流程与主流程的流分开处