我有一个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
之间共享实例?