spring context初始化兩次,以及bean兩次建立,以及其形成dubbo端口被佔用Failed to bind NettyServer,以及其餘重複建立對象等問題

當項目被部署到tomcat的webapps目錄下時,會出現spring context初始化兩次,以及bean兩次建立,以及其形成dubbo端口被佔用Failed to bind NettyServer,以及其餘重複建立對象等問題。java

1. 具體表現:

  1. Spring打印2次初始化日誌
/*Spring 打印2次初始化日誌
Initializing Spring root WebApplicationContext
      ......
Initializing Spring root WebApplicationContext
*/
  1. 數據庫會多一倍的鏈接
--查詢數據庫鏈接
--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
  1. 使用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
      ......
*/
  1. 定時任務,或某個明確要求單例的對象卻實例出了兩個對象,單例bean打印了2次建立日誌等
/*某個單例對象,打印了2次對象建立日誌
[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'
      .........
[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'
      .........
*/

2. 緣由:

  • server.xml中Host節點的autoDeploy屬性表示是否開啓熱部署,deployOnStartup屬性表示是否啓動時部署
  • 但Tomcat自身熱部署並不完善
  • 啓用熱部署webapps時會出現部署2次的狀況,新加入war包等同於改動,tomcat在掃描改動時, 再次把webapps下的web應用給部署進來

3. 解決辦法:

  1. 修改項目所在tomcat所使用的server.xml中appBase="webapps"的Host節點的autoDeploy屬性和deployOnStartup屬性爲false
<!--關閉Tomcat熱部署和啓動部署(能夠不關deployOnStartup)以免兩次部署,此時須要手動部署-->
<Host appBase="webapps" autoDeploy="false" deployOnStartup="false" name="localhost" unpackWARs="true">
  <!--內部節點-->
  <Context/>
</Host>
  1. 將項目發佈到tomcat\webapps\ROOT目錄下mysql

  2. 修改項目的Deploy Path爲除了tomcat\webapps之外的其餘文件夾,如tomcat\myapp(這個方法對於Eclipse啓動Tomcat來講最方便實用)nginx

  3. 使用nginx指向tomcatweb

相關文章
相關標籤/搜索