你的位置:首页 > Java教程

[Java教程]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 秒钟

两次初始化 会导致很多问题。

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:     34Current database:Current user:      ODBC@SSL:          Not in useUsing delimiter:    ;Server version:     5.6.27-log MySQL Community Server (GPL)Protocol version:    10Connection:       localhost via TCP/IPServer characterset:  utf8mb4Db   characterset:  utf8mb4Client characterset:  utf8mb4Conn. characterset:  utf8mb4TCP port:        3306Uptime:         8 hours 12 min 16 secThreads: 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目录下;

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