修改了 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 秒鐘。
兩次初始化 會導致很多問題。
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) | +------+-------------+ | | 6 | +------+-------------+ 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: 6 Questions: 20950 Slow queries: 0 Opens: 131 Flush tab --------------
Threads: 6 表示有6個連接。
2. 問題二
會 導致dubbo消費者注冊了兩次。
....
3. 解決方法:
1)可以在 tomcat 前端 加個 nginx, 讓 nginx 指向 tomcat,這樣就不用修改 項目的 context root 目錄到 / 了;
2)可以直接在發布項目時,打個包,然後解壓到 tomcat 的 ROOT目錄下,這樣也 不需要修改 項目的 context root 目錄到 / 了;
3)如果覺得 打包,然後解壓到 tomcat的 root 目錄還是麻煩,那麼可以將項目的名稱 改成 ROOT,然後將 項目的 context root 改成 /,可以直接發布到了 tomcat 的ROOT目錄下;
不需要打包,然後解壓了;