簡體   English   中英

在不重啟的情況下將應用程序部署/重新部署到Tomcat的過程

[英]Pitfals of deploying/redploying app to Tomcat without restarting

我已經讀過,Tomcat 5.5+可以在不重啟的情況下將戰爭部署到Tomcat服務器。 聽起來不錯,但我想我對此功能及其可靠性持懷疑態度。 我以前的經驗(使用Websphere)是重啟服務器以避免內存問題等的最佳實踐。因此,我想獲得有關Tomcat可能存在的陷阱的反饋。

(要明確我的經驗,我為一家大型公司開發了Java Web應用程序5年,該公司將應用程序開發人員從應用程序服務器工程師中分離出來-我們使用了Websphere-因此,我在運行/配置任何應用程序方面沒有太多經驗我自己的應用服務器)

通常,存在多種類型的泄漏,它們適用於重新部署方案。 對於生產系統,如果可能的話,最好是執行重新啟動,因為當今的應用程序中使用了許多不同的組件和庫,因此很難找到所有組件和庫,甚至很難修復它們。 Esp。 如果您無法訪問所有源代碼。

  • 內存泄漏
  • 線程和ThreadLocal泄漏
  • ClassLoader泄漏
  • 系統資源泄漏
  • 連接泄漏

ClassLoader泄漏是導致重新部署的原因

它們可能是由萬物造成的。 真的,我的意思是:

  • 計時器:計時器具有線程,並且在運行時創建的線程繼承當前上下文類加載器,這意味着Tomcat的WebappClassloader。
  • ThreadLocals: ThreadLocals綁定到線程。 應用服務器使用線程池。 當將ThreadLocal綁定到線程並將線程返回給池時,如果沒有人正確地將其刪除,則ThreadLocal將停留在該池中。 經常發生且很難找到(除了很少使用的Spring NamedThreadLocal以外,ThreadLocals沒有名稱)。 如果ThreadLocal持有由WebappClassloader加載的類,則將發生ClassLoader泄漏。
  • 緩存:例如EhCache CacheManager
  • 反射: JavaBeans內部檢查器(例如,保存類或方法緩存)
  • JDBC驅動程序:無論如何,它們都不應位於.war文件中。 靜態注冊表泄漏
  • 緩存ClassLoader的靜態庫,例如Commons-Logging LogFactory

特定於Tomcat,我的經驗如下:

  • 對於帶有“干凈”庫的簡單應用程序,它在Tomcat中可以正常工作
  • Tomcat非常努力地清理由WebappClassloader加載的類。 例如,當取消部署Webapp時,所有類的靜態字段都設置為null。 有時在取消部署期間運行代碼時,這會導致NullPointerExceptions,例如,使用Logger進行后台作業
  • Tomcat的Listener可以清理更多內容。 它名為org.apache.catalina.core.JreMemoryLeakPreventionListener ,最近提交給Tomcat6.x。

我寫了一篇博客文章,介紹了我在進行重新部署壓力測試時遇到的泄漏的經驗 -試圖“修復”企業級Java Web應用程序的所有可能的泄漏。

熱部署非常好,因為它通常比啟動和關閉服務器快得多。

mhaller寫了很多關於避免泄漏的文章。 另一個問題是活動用戶的會話必須在應用程序“重新啟動”后仍然有效。 有幾件事情必須要照顧,但總的來說,這意味着它們的會話必須是可序列化的,然后才能正確地反序列化。 如果您有狀態的數據庫連接等,這可能會有些棘手,但是如果您的代碼對於數據庫的連接是健壯的,那應該還不錯。

還要注意,某些IDE允許在保存修改后的源文件時更新WAR中的代碼(與應用程序相同),而不必重新部署。 MyEclipse很好地做到了這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM