上一篇文章刚说项目部署到tomcat的ROOT中,今天就发现一个问题。通过eclipse启动tomcat时候,WebApplicationContext 初始化两次;
现象:
通过eclipse控制台看到日志中WebApplicationContext 初始化两次,从而导致一个端口一直被占用;(怎么修改都是占用)
第一次初始化:
九月 27, 2016 11:43:20 下午 org.apache.catalina.core.ApplicationContext log
信息: Initializing Spring root WebApplicationContext
第一使用端口
2016-09-27 23:43:27 SocketIO server started at port: 8081
第二次初始化
九月 27, 2016 11:43:37 下午 org.apache.catalina.core.ApplicationContext log
信息: Initializing Spring root WebApplicationContext
第二次使用端口:
2016-09-27 23:43:45 SocketIO server start failed at port: 8081!
failed 。。。。。刚开始以为其他程序占用了8081端口,使劲修改端口都不行。才注意到启动了两次;
产生的原因及后果:
两次发布的原因是,tomcat 会发布一次 /xxx ,然后再发布一次 / ,所以就有了两次发布,两次 WebApplicationContext 的初始化。
导致问题:
问题一
第二次初始化时,会导致 数据库的连接数,增加 初始化 的数量,比如数据库连接的初始化数目为:
initialPoolSize=20
那么 第二次初始化 WebApplicationContext 会导致 数据库的连接数 增加 20 个,第一次初始化 WebApplicationContext 的数据库连接不会释放!
问题二
导致端口占用。
问题三
会导致 定时器 任务 会多次触发.
….
解决方法:
可以在 tomcat 前端 加个 nginx, 让 nginx 指向 tomcat,这样就不用修改项目的 context root目录到 / 了;
可以直接在发布项目时,打个包,然后解压到 tomcat 的 ROOT目录下,这样也 不需要修改 项目的 context root
目录到 / 了;如果觉得 打包,然后解压到 tomcat的 root 目录还是麻烦,那么可以将项目的名称 改成 ROOT,然后将 项目的 context root 改成 /,可以直接发布到了 tomcat 的ROOT目录下;不需要打包,然后解压了;
不要把Deploy path设置成webapps就可以了,也就是不让tomcat去加载webapps那一次
第4中方法在开发时,应该是很好用的。