【问题标题】:Another CacheManager with same name '' already exists in the same VM while application starts应用程序启动时,同一虚拟机中已存在另一个同名 '' 的 CacheManager
【发布时间】:2015-06-29 15:16:25
【问题描述】:
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 时,我发现异常不会在启动时出现。但是当我第一次尝试点击任何控制器类时就会发生这种情况。

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

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

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

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

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

【问题讨论】:

  • contextConfigLocation

标签: java spring spring-mvc ehcache


【解决方案1】:

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:控制器、视图、拦截器等。
  • 或将所有内容放在根上下文中,而将另一个留空。这可以工作,因为根上下文是第一个调度程序 servlet 的父级,因此 Spring MVC 在第二个中找不到根上下文 bean。

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

【讨论】:

  • 谢谢,在我的情况下,我只是使用 contextConfigLocation 禁用了第二次初始化/初始化参数> 。根据文档,如果我们为参数值提供空值,它会阻止加载。我希望它能解决你上面提到的危险
  • @SharathM :我认为这应该足够了,因为您将获得调度程序 servlet 的空上下文。我不太喜欢将通用名称用于其他常用名称,因为这可能会使您的应用程序的未来维护者感到困惑。一定要记录下来!
  • 谢谢,记下您的建议。这是我的第一个春季项目。
猜你喜欢
  • 2017-01-27
  • 2012-04-18
  • 1970-01-01
  • 1970-01-01
  • 2013-03-17
  • 2015-10-10
  • 2011-04-04
  • 2012-06-23
  • 1970-01-01
相关资源
最近更新 更多