tomcat 重复加载项目

在我们使用一个Tomcat实现了多端口多域名访问项目后。如果配置不当,随之而来的问题就是Tomcat启动时项目重复加载,同一个项目会被加载多次;如果一个Tomcat里面的项目较多或者服务器的配置低,就会引发服务器的运行严重缓慢,占用很多系统资源,很容易就出现了内存溢出。

演示环境

  • Tomcat 8.5

导致的原因

我们在配置项目通过域名访问的时候,会有这样的配置:

<Host name="www.jerome.xin"  appBase="webapps" unpackWARs="true" autoDeploy="true">
	<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
           prefix="localhost_access_log" suffix=".txt"
           pattern="%h %l %u %t &quot;%r&quot; %s %b" />
	<Context docBase="/project" path=""/>  
</Host>

因为我们同时配置了Host标签的appBaseContext标签的docBase,所以当启动Tomcat的时候,加载到<Host></Host>的时候,就会去加载appBase配置路径下的项目,当加载到<Context>的时候,又加载了一次docBase配置路径下的项目;然后Tomcat继续按照配置文件执行,直到完成。

appBasedocBase区别

  • appBase是指定虚拟主机的目录,可以指定绝对目录,也可以指定相对于的相对目录。如果没有此项,默认为/webapps目录下。

  • docBase是指定Web应用的文件路径。可以给定绝对路径,也可以给定相对于HostappBase属性的相对路径。如果Web应用采用开放目录结构,那就指定Web应用的根目录;如果Web应用是个WAR文件,那就指定WAR文件的路径。

解决办法

webapps下只有一个项目

webapps目录下只有一个项目的时候,我们只需要这样配置就可以避免项目的重复加载:

<Host name="www.jerome.xin"  appBase="webapps" unpackWARs="true" autoDeploy="true">
	<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
           prefix="localhost_access_log" suffix=".txt"
           pattern="%h %l %u %t &quot;%r&quot; %s %b" />
	<Context docBase="/project" path="" name="/project"/>  
</Host>

当有多个项目时

因为我们上面说了,在我们不指定appBase的时候,默认取用/webapps作为虚拟主机的目录。所以我们把另外的项目放到/webapps下面时,启动Tomcat的时候,还是会加载项目的。所以我们需要新建一个目录来存放我们的其它项目。比如新建一个/myapps/webapps同级的目录,将项目放到里面,我们只需要做这样的更改:

<Host name="firstapp.jerome.xin" unpackWARs="true" autoDeploy="true">
	<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
           prefix="localhost_access_log" suffix=".txt"
           pattern="%h %l %u %t &quot;%r&quot; %s %b" />
	<Context docBase="../myapps/project1" path=""/>  
</Host>

<Host name="secondapp.jerome.xin" unpackWARs="true" autoDeploy="true">
	<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
           prefix="localhost_access_log" suffix=".txt"
           pattern="%h %l %u %t &quot;%r&quot; %s %b" />
	<Context docBase="../myapps/project2" path=""/>  
</Host>

我们上面的配置Host的时候并没有使用appBases标签,而只是配置了docBase,当然为了避免出错这里也可以使用绝对路径来配置。

总结

我们上面已经完美的解决了项目重复加载的问题,当多个项目部署在同一个Tomcat容器中,配置域名访问的时候就不会导致资源重复加载。

原文链接:Tomcat 重复加载项目

转载于:https://my.oschina.net/JeromeZhu/blog/2993088

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值