2012-11-18 60 views
14

根據鏈接http://www.xyzws.com/Servletfaq/when-is-destroy-of-servlets-called/20,調用銷燬方法的原因之一是,當servlet長時間沒有收到請求時調用servlet的銷燬方法

我在想可能會有一些頁面長時間沒有被調用。那麼,這是否意味着摧毀會被調用,它們將不再被使用?

實際上,我在採訪時被問到這個問題,他告訴我,只有在服務器關閉時纔會調用destroy方法。

欣賞這方面的任何幫助。

+3

我不認爲這是對你的殺死一個servlet。不應該是你的責任,這就是爲什麼你在一個servlet容器中,而一個servlet是一個託管資源 – kolossus

回答

0

這是那些經典的spec和實現的東西之一。規範允許像Tomcat這樣的Servlet容器維護一個Servlet對象池,在負載升高或降低時創建並銷燬它們。在這種設置中,當不再需要特定實例時會調用destroy。爲每個請求創建一個新的實例甚至是合法的,在處理請求之前立即調用init並直接銷燬。

然而在實踐中,實際上每個Servlet容器都只維護每個Servlet的一個實例。由於Servlets必須是線程安全的,這也是完全可以的。在這種情況下,僅在關閉上下文時調用destroy。

我不能想到很多情況下,你想要池Servlets,但它是規範允許的。

3

從規範(The Servlet Interface -> Servlet Life Cycle -> End of Service):

一旦破壞方法被稱爲上的servlet實例,容器可以不路線 其它請求給servlet的該實例。如果容器需要再次啓用 servlet,則必須使用servlet類的新實例來完成此操作。

該規範指的是被銷燬的servlet的特定實例。

那麼,這是否意味着摧毀將被調用,他們將不再使用?

這並不意味着從不使用實例被銷燬的servlet。只有那些沒有被使用的特定實例會被垃圾收集。當該servlet發出請求時,容器將創建該servlet的新實例,並再次執行所有生命週期操作,直到服務請求。

0

它完全取決於您正在使用的servlet容器的實現。如果您的servlet容器對於節省資源非常保守,它可能會摧毀長時間未運行的servlet。

在servlet spec 2.5的第22頁中,您會發現,「當servlet容器確定應該從服務中刪除一個servlet時,它會調用Servlet接口的destroy方法以允許servlet釋放它的任何資源正在使用並保存任何持久狀態。例如,容器可能會在保存內存資源或關閉時執行此操作。「

9

據我所知,

在的Java Servlet,destroy()不應該由程序員調用。但是,如果調用它,它就會被執行。隱含的問題是,這個servlet被摧毀嗎?不,不會。destroy()方法是不應該,也不會摧毀一個Java servlet。

destroy()在Java Servlet的含義,內容被剛當容器決定摧毀這個servlet之前執行。但是,如果你調用您自己的方法,內容剛剛得到執行,然後相應的過程繼續。對於這個問題,destroy()被執行,然後servlet初始化完成。

destroy()方法先被調用,然後Servlet從容器中被移除,然後最終被垃圾收集。 destroy()方法通常包含用於釋放不會被垃圾收集的任何資源(如JDBC連接)的代碼。

0

Servlet.destroy()的javadoc說:「由servlet容器調用以向servlet指示該servlet正在退出服務」。它沒有指定什麼情況會導致servlet「停止服務」,它只是一個事件,如果需要,您可以對此做出反應。例如,您可能想要關閉一些已打開的資源,或者保留一些狀態以存儲。

最明顯的原因是servlet容器正在關閉,但是一個容器同樣可以決定卸載一個servlet,因爲它沒有在一個月內使用過,而且只是消耗資源。這種行爲完全取決於實現,它不是你(作爲servlet設計者)應該關注的東西。

3

夫婦箱子:

  1. 當容器關閉或在應用程序關閉;
  2. 當容器決定內存不足時;
  3. 當這個servlet長時間沒有收到請求時。

作爲每文檔

由servlet容器調用以指示所述 的servlet正在退出服務的servlet。此方法僅調用一次 servlet的服務方法中的所有線程已經退出或在超時期限過去之後。在servlet容器調用這個方法之後,它不會再在這個servlet上調用服務方法。

0

Servlet的destroy方法是一個回調函數。這些是容器在特定事件即將發生時調用的函數(在這種情況下即將被銷燬的servlet)。因此,整個目的是,如果你想做一些事情(例如:清理資源),你可以在這個回調下做那些事情。