另一个具有相同名称的CacheManager''应用程序启动时,已存在于同一VM中

时间:2015-04-22 06:34:12

标签: java spring spring-mvc ehcache

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。创建非Singleton CacheManagers的CacheManager()构造函数可能违反此规则。

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

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

我相信如果我为调度程序servlet添加init params将会有效。在评论中提到。在我的情况下,我没有调度程序servlet的单独应用程序上下文,所以我相信它在我的应用程序上下文中工作正常。 更新: 因此,当我真的需要为我的调度程序servlet提供单独的应用程序上下文时,最佳做法是从第二个上下文中删除缓存声明(在本例中)并在root配置上进行这些配置?如果我错了,请纠正我

1 个答案:

答案 0 :(得分:2)

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

当您使用Spring MVC时,您拥有根上下文和使用root作为其父级的调度程序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个上下文并且:

  • 任一
    • 放入root one:所有与调度程序servlet无关的内容:模型,持久性bean,过滤器等。
    • 输入调度员servlet:控制器,视图,拦截器等。
  • 或将所有内容放在根上下文中并将其他内容留空。这可以工作,因为根上下文是调度程序servlet 1的父级,因此Spring MVC查找在第二个中找不到的根上下文bean。

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

相关问题