当项目被部署到tomcat的webapps目录下时,会出现spring context初始化两次,以及bean两次创建,以及其造成dubbo端口被占用且两次注册,以及其他重复创建对象等问题。
具体表现:
1.Spring打印2次初始化日志
/*Spring 打印2次初始化日志
Initializing Spring root WebApplicationContext
......
Initializing Spring root WebApplicationContext
*/
2.数据库会多一倍的连接
--查询数据库连接
--oracle
select sess.sid,sess.serial#,sess.machine,
lo.oracle_username,lo.os_user_name,
ao.object_name,lo.locked_mode from v$locked_object lo,
dba_objects ao,v$session sess
where ao.object_id = lo.object_id and lo.session_id = sess.sid;
--mysql
select host, count(host) from information_schema.processlist;
--mysql也可以直接status查看状态
status
3.使用Dubbo时,启动时会出现出现Failed to bind NettyServer异常(即dubbo 注册了两次,dubbo端口被占用 )
/* 项目启动异常绑定某个IP:PORT失败,该端口已经被占用
Caused by: com.alibaba.dubbo.remoting.RemotingException: Failed to bind NettyServer on /10.0.15.163:20892, cause: Failed to bind to: /0.0.0.0:20892
......
Caused by: org.jboss.netty.channel.ChannelException: Failed to bind to: /0.0.0.0:20892
......
Caused by: java.net.BindException: Address already in use: bind
......
*/
4.定时任务,或某个明确要求单例的对象,却出现了2个对象,单例bean打印了2次创建日志
/*某个单例对象,打印了2次对象创建日志
[localhost-startStop-0] DEBUG 单例对象XXX创建成功!
[localhost-startStop-0] DEBUG Creating instance of bean 'beanName'
[localhost-startStop-0] DEBUG Creating shared instance of singleton bean 'beanName2'
.........
[localhost-startStop-1] DEBUG 单例对象XXX创建成功!
[localhost-startStop-1] DEBUG Creating instance of bean 'beanName'
[localhost-startStop-1] DEBUG Creating shared instance of singleton bean 'beanName2'
*/
解决办法:
1.修改项目所在tomcat所使用的server.xml中appBase="webapps"的Host节点的autoDeploy属性和deployOnStartup属性为false
2.将项目发布到tomcat\webapps\ROOT目录下
3.修改项目的Deploy Path为除了tomcat\webapps以外的其他文件夹,如tomcat\myapp
3. 使用nginx指向tomcat