Tomcat 8上的Spring WebApp-共享对象

时间:2018-09-26 02:28:45

标签: java spring tomcat web-applications

我有一个Spring J2ee Web应用程序,该应用程序被编译成单个.war文件

在Apache Tomcat(8.0)的生产环境中,DevOps定义了多个Hosts,每个都引用同一个(爆炸的)WebApp。

server.xml:

<Host name="www.tenant1.com" appBase="webapps" xmlValidation="false" xmlNamespaceAware="false">
      <Context path="/tms" reloadable="false">
      <ResourceLink name="jdbc/tenant1" global="jdbc/all" type="javax.sql.DataSource"/>

      </Context>
</Host>

<Host name="www.tenant2.com" appBase="webapps" xmlValidation="false" xmlNamespaceAware="false">
      <Context path="/tms" reloadable="false">
      <ResourceLink name="jdbc/tenant2" global="jdbc/all" type="javax.sql.DataSource"/>

      </Context>
</Host>

添加的Hosts越多,Tomcat启动所需的时间就越长(并且使用的堆内存也更多)。

如果可以共享某些对象的实例(主机不会改变),我相信可以提高效率。

作为一个实验,我查看了一个名为JaxbFactory的应用程序中的bean,该bean实例化了一些JAXBContext对象来解组XML文件-因为我知道这在时间和内存方面都很昂贵。

我尝试将bean变成Singleton,并将JAXBContext声明为静态

@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class JaxbFactory {

static JAXBContext reportContext;

  public JaxbFactory() throws Exception {
    if (reportContext == null) {
        reportContext = JAXBContext.newInstance(Constants.JaxbContext.report);
  }
}

但是仍然为每个Host创建一个reportContext的新实例。 (我怀疑情况会如此,因为在SpringBean生命周期方面,“ Singleton”的定义与原始GoF定义不同)

是否可以在Tomcat Host之间共享实例?

0 个答案:

没有答案