zoukankan      html  css  js  c++  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 秒钟。两次发布的原因是,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中方法在开发时,应该是很好用的。

  • 相关阅读:
    Dumpbin 工具的使用
    ffmpeg Windows下采集摄像头一帧数据,并保存为bmp图片
    directdraw显示yuv视频,出现屏保时,yuv显示不出来,表面丢失
    DirectX截图黑屏的解决办法
    VS2008 Project : error PRJ0019: 某个工具从以下位置返回了错误代码: "正在执行生成后事件..."解决方案
    RoundingMode 几个参数详解
    IDEA导入eclipse项目并部署运行完整步骤(转发)
    Intellij idea操作maven时控制台中文乱码
    java 替换json字符串中间的引号保留两边的引号,避免json校验失败
    分布式ID解决方案
  • 原文地址:https://www.cnblogs.com/digdeep/p/5421938.html
Copyright © 2011-2022 走看看