gpt4 book ai didi

java - 应用程序启动时,同一个 VM 中已存在另一个同名 '' 的 CacheManager

转载 作者:行者123 更新时间:2023-11-30 08:53:28 24 4
gpt4 key购买 nike

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.

这是 web.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>

当我检查日志时,我发现应用程序上下文被初始化了两次。我刚刚通过禁用调度程序 servlet 启动时的负载来验证它。当我禁用调度程序 servlet 时,我发现异常不会在启动时出现。但它发生在我第一次尝试点击任何 Controller 类时。

我在 Why does Spring MVC need at least two contexts? 中发现了一些类似的问题, Spring - application Initialized twice?

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

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

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

我相信如果我为调度程序 servlet 添加初始化参数它会起作用。评论中提到。就我而言,我没有用于调度程序 servlet 的单独应用程序上下文,因此我相信它在我的应用程序上下文中工作正常。更新:因此,当我真的需要为我的调度程序 servlet 提供单独的应用程序上下文时,最佳做法是从第二个上下文中删除缓存声明(在本例中)并在根配置上进行这些配置?如果我错了请纠正我

最佳答案

您几乎找到了 Why does Spring MVC need at least two contexts? 的答案问题。

当您使用 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个上下文和:

  • 要么
    • 放入根一:所有与调度程序 servlet 无关的内容:模型、持久性 bean、过滤器等。
    • 放入调度程序 servlet 1: Controller 、 View 、拦截器等。
  • 或者将所有内容都放在根上下文中并将另一个留空。这是可行的,因为根上下文是第一个调度程序 servlet 的父级,因此 Spring MVC 查找在第二个中找不到的根上下文 bean。

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

关于java - 应用程序启动时,同一个 VM 中已存在另一个同名 '' 的 CacheManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29789525/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com