上一篇文章剛說項目部署到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中方法在開發時,應該是很好用的。