gpt4 book ai didi

java - 多个 Spring 根 WebApplicationContexts

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:18:01 27 4
gpt4 key购买 nike

我有一个带有两个 web 应用程序(foo 和 bar)的 tomcat 服务器,它们具有相同的部署 war 。部署使用标准的 Spring/Hibernate 设置。我假设这两个 webapps 将启动并完全独立于彼此运行,但事实并非如此 - webapp foo 正常加载,但 webapp bar 有一些奇怪的行为 - 就好像它正在使用来自 webapp 的一些相同的 beans富。例如,当 bar 启动时(第二个启动的 webapp),c3p0 提示它已经注册了——大概在 webapp foo 中。同样,我试图让这两个 webapps 完全独立,这样两个 c3p0/hibernateSessionFactory bean 就不可能相互了解。

在做一些研究时,我被引导相信两个 webapps 中使用了相同的 Spring 根 WebApplicationContext。如果是这样,我怎样才能使每个 webapp(在同一台 tomcat 服务器上)完全相互独立?是否还有其他可能导致此问题的原因?

web.xml 的相关摘录:

<web-app>
<context-param>
<param-name>org.hibernate.tags.sessionFactory</param-name>
<param-value>hibernate/SessionFactory</param-value>
</context-param>

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/context/*Context.xml</param-value>
</context-param>

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
<servlet-name>fooServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
</web-app>

最佳答案

我有一个疑问。类加载不是问题的根源吗?

我猜你的问题的直接原因是一些 Spring 类被加载一次并在这两个 WAR 之间共享。我不知道类的确切名称,但 Spring 需要在一些静态字段中存储一些共享信息(至少是对应用程序上下文的引用)。然后,当两个 WAR 看到类的同一个副本时,两个应用程序就会看到这个静态字段的相同状态。我想在您的设置中,Spring 只创建了一个应用程序上下文(当应该创建第二个应用程序上下文时,Spring 会找到一个现有的应用程序上下文并改为使用它)。

我认为造成这种问题的可能有两个原因:

  • 这是一个类加载问题。我不太喜欢 tomcat,也不知道如何以及是否可以配置它,但通常在 JavaEE 应用程序服务器中,有一些方法可以为 WAR 配置类加载。
  • 或者这是一种内存泄漏。也许这个类(及其静态字段)是从以前的一些部署中重新使用的(不太可能,你的描述倾向于建议你在新的 tomcat 实例上遇到问题)。您可以通过确保在(重新)启动 tomcat 后立即出现问题来排除这种可能性。

更新:如果这是关于类加载的,我会尝试找出是哪个类(及其静态字段)导致了问题。这可能不是您的类,而是您在应用程序中使用的某些第 3 方库类。看完http://tomcat.apache.org/tomcat-6.0-doc/class-loader-howto.html您可以看到 Tomcat 为每个应用程序使用了不同的不相关的类加载器。但是,如果他们不知道该类,他们都共享他们委托(delegate)给的父类加载器。同样,我不知道您的确切设置和 Tomcat 的一些特性,但是......在 Tomcat 中是否可以将一些库(JAR),如 c3p0 或 Spring,放在一些常见的“lib”文件夹中(文档说$CATALINA_HOME/lib)?在这种情况下,这些 JAR 中的类是使用父类加载器(在 tomcat 文档中称为“Common”的加载器)加载的。这意味着它们只加载一次。

长话短说,我想原因是您的 $CATALINA_HOME/lib 中的一个 JAR 有一些严重依赖于某些静态字段的类。 Tomcat 使用通用类加载器加载 JAR 的策略导致所有应用程序共享这些静态字段的状态。

我告诉过你这只是一种怀疑和猜测吗?

关于java - 多个 Spring 根 WebApplicationContexts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4331718/

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