首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Spring 專案修改 context-root 為 / 導致 WebApplicationContext 雙重初始化解決方案

     編輯:Java 綜合教學

問題現象

將 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

雙重初始化帶來的嚴重後果

1. 資料庫連線池洩漏

首次初始化建立的連線池(如 initialPoolSize=20)不會釋放,第二次再建立 20 條連線,導致連線數翻倍。可透過 SELECT host, COUNT(host) FROM information_schema.processlist 或 MySQL status 指令觀察 Threads 數量驟增。

2. Dubbo 消費者重複註冊

服務消費者向註冊中心註冊兩次,導致服務治理異常、負載均衡錯亂。

根因分析

Tomcat 預設會部署 ROOT 應用於 / 路徑。當專案同時設定 context-root=/ 並部署為非 ROOT 名稱時,Tomcat 會同時部署:

  1. 專案原本的 context-path(如 /myapp)
  2. 因 context-root=/ 觸發的 ROOT 應用部署

兩個 Web 應用共享同一個 Spring 配置,導致雙重初始化。

三種解決方案(推薦順序)

方案一:前置 Nginx 反向代理(最推薦,零代碼侵入)

保持專案 context-root=/myapp 不變,Nginx 配置 location / { proxy_pass https://tomcat:8080/myapp; }。優點:生產環境標準架構、支援靜態資源分離、SSL 終結、負載均衡。

方案二:打包部署至 Tomcat ROOT 目錄

將專案打包為 ROOT.war,放入 tomcat/webapps/,刪除原有 ROOT 目錄。Tomcat 啟動時自動部署為根應用。缺點:需重新打包、部署流程較繁瑣。

方案三:專案改名為 ROOT 並設定 context-root=/

在 IDE 或建構腳本中將專案名稱改為 ROOT,同時保持 context-root=/。發布時直接部署到 webapps/ROOT,免去打包解壓步驟。注意:需確保無其他應用佔用 ROOT 名稱。

驗證建議

啟動後檢查日誌僅出現一次 Initializing Spring root WebApplicationContext,並確認資料庫連線數、Dubbo 註冊數均符合預期。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved