spring項目的 context root 修改之后,導致 WebApplicationContext 初始化兩次的解決方法


修改了 spring web 項目的 context root 為 / 之后,在啟動項目時,會導致 WebApplicationContext  初始化兩次,下面是其初始化日志:

第一次初始化:

四月 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

可以看到兩次初始化之間僅僅相隔了 6 秒鍾。兩次發布的原因是,tomcat 會發布一次 /xxx ,然后在發布一次 / ,所以就有了兩次發布,兩次 WebApplicationContext  的初始化

兩次初始化 WebApplicationContext   會導致很多問題:

1. 問題一

第二次初始化時,會導致 數據庫的連接數,增加 初始化 的數量,比如數據庫連接的初始化數目為:

initialPoolSize=20

那么 第二次初始化 WebApplicationContext  會導致 數據庫的連接數 增加 20 個,第一次初始化 WebApplicationContext  的數據庫連接不會釋放

使用 select host, count(host) from information_schema.processlist; 可以查看 連接數;

也可以使用 status 名錄,直接查看連接數:

mysql> select host, count(host) from information_schema.processlist;
+------+-------------+
| host | count(host) |
+------+-------------+
|      |           46 |
+------+-------------+
1 row in set (0.01 sec)

mysql> status
--------------
mysql  Ver 14.14 Distrib 5.6.27, for Win32 (x86)

Connection id:          34
Current database:
Current user:           ODBC@
SSL:                    Not in use
Using delimiter:        ;
Server version:         5.6.27-log MySQL Community Server (GPL)
Protocol version:       10
Connection:             localhost via TCP/IP
Server characterset:    utf8mb4
Db     characterset:    utf8mb4
Client characterset:    utf8mb4
Conn.  characterset:    utf8mb4
TCP port:               3306
Uptime:                 8 hours 12 min 16 sec

Threads: 46  Questions: 20950  Slow queries: 0  Opens: 131  Flush tab
--------------
Threads: 46 表示有46個連接。

2. 問題二

  會 導致dubbo消費者注冊了兩次。

3. 問題三

  會導致 定時器 任務 會多次觸發.

....

4. 解決方法:

1)可以在 tomcat 前端 加個 nginx, 讓 nginx 指向 tomcat,這樣就不用修改 項目的 context root 目錄到 / 了;

2)可以直接在發布項目時,打個包,然后解壓到 tomcat 的 ROOT目錄下,這樣也 不需要修改 項目的 context root 目錄到 / 了;

3)如果覺得 打包,然后解壓到 tomcat的 root 目錄還是麻煩,那么可以將項目的名稱 改成 ROOT,然后將 項目的 context root 改成 /,可以直接發布到了 tomcat 的ROOT目錄下;

不需要打包,然后解壓了;

4)不要把Deploy path設置成webapps就可以了,也就是不讓tomcat去加載webapps那一次

第4中方法在開發時,應該是很好用的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM