將 Spring Web 專案的 context-root 修改為 / 後,啟動時 WebApplicationContext 初始化兩次,兩次初始化間隔約 6 秒。日誌如下:
四月 22, 2016 4:30:33 下午 org.apache.catalina.core.ApplicationContext log 信息: Initializing Spring root WebApplicationContext 四月 22, 2016 4:30:39 下午 org.apache.catalina.core.ApplicationContext log 信息: Initializing Spring root WebApplicationContext
首次初始化建立的連線池(如 initialPoolSize=20)不會釋放,第二次再建立 20 條連線,導致連線數翻倍。可透過 SELECT host, COUNT(host) FROM information_schema.processlist 或 MySQL status 指令觀察 Threads 數量驟增。
服務消費者向註冊中心註冊兩次,導致服務治理異常、負載均衡錯亂。
Tomcat 預設會部署 ROOT 應用於 / 路徑。當專案同時設定 context-root=/ 並部署為非 ROOT 名稱時,Tomcat 會同時部署:
/myapp)context-root=/ 觸發的 ROOT 應用部署兩個 Web 應用共享同一個 Spring 配置,導致雙重初始化。
保持專案 context-root=/myapp 不變,Nginx 配置 location / { proxy_pass https://tomcat:8080/myapp; }。優點:生產環境標準架構、支援靜態資源分離、SSL 終結、負載均衡。
將專案打包為 ROOT.war,放入 tomcat/webapps/,刪除原有 ROOT 目錄。Tomcat 啟動時自動部署為根應用。缺點:需重新打包、部署流程較繁瑣。
在 IDE 或建構腳本中將專案名稱改為 ROOT,同時保持 context-root=/。發布時直接部署到 webapps/ROOT,免去打包解壓步驟。注意:需確保無其他應用佔用 ROOT 名稱。
啟動後檢查日誌僅出現一次 Initializing Spring root WebApplicationContext,並確認資料庫連線數、Dubbo 註冊數均符合預期。