簡體   English   中英

調用servlet的destroy方法

[英]Calling servlet's destroy method

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

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

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

感謝任何幫助。

據我所知,

在java servlet中, destroy()不應該由程序員調用。 但是,如果它被調用,它就會被執行。 隱含的問題是,servlet會被破壞嗎? 不,它不會。 destroy()方法不應該也不會破壞java servlet。

java servlet中destroy()的含義是,當容器決定銷毀servlet之前,內容就會被執行。 但是如果你自己調用destroy()方法,那么內容就會被執行,然后相應的進程繼續。 對於這個問題, destroy()被執行,然后servlet初始化完成。

首先調用destroy()方法,然后從容器中刪除Servlet,最后進行垃圾回收。 destroy()方法通常包含釋放任何資源(如JDBC連接destroy()代碼,這些資源不會被垃圾回收。

幾個案例:

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

根據文件

由servlet容器調用,以向servlet指示servlet正在停止服務。 只有在servlet的服務方法中的所有線程都已退出或超時期限過后,才會調用此方法。 在servlet容器調用此方法之后,它不會再在此servlet上調用服務方法。

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

在servlet實例上調用destroy方法后,容器可能不會將其他請求路由到該servlet實例。 如果容器需要再次啟用servlet,則必須使用servlet類的新實例。

規范指的是正在銷毀的servlet的特定實例。

那么,這是否意味着銷毀將被調用,它們將不再使用?

這並不意味着永遠不會使用其實例被銷毀的servlet。 它只是那個沒有使用的特定實例,因為它本來是垃圾收集的。 當請求進入該servlet時,容器將創建該servlet的新實例並執行所有生命周期操作,直到再次提供請求為止。

這是經典規范與實現之一。 規范允許像Tomcat這樣的Servlet容器來維護Servlet對象池,在負載上升或下降時創建和銷毀它們。 在這種設置中,當不再需要特定實例時,將調用destroy。 為每個請求創建一個新實例甚至是合法的,在處理請求之前立即調用init並在之后立即銷毀。

但實際上,實際上每個Servlet容器都只維護每個Servlet的一個實例。 由於要求Servlet是線程安全的,所以這也是完全可以的。 在這種情況下,僅在關閉上下文時調用destroy。

我想不出很多你想要匯集Servlet的情況,但規范允許這樣做。

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

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

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

最明顯的原因是servlet容器正在關閉,但容器同樣可以很好地決定是否需要卸載servlet,因為它在一個月內沒有被使用,只是消耗資源。 這種行為完全取決於實現,並不是你(作為servlet設計者)應該關注的事情。

Servlet的destroy方法是一個回調。 這些是當特定事件即將發生時容器調用的函數(在這種情況下,servlet即將被銷毀)。 因此,如果您想要做某事(例如:清理資源),您可以在此回調下執行此操作。

從Servlet規范: -

servlet容器調用destroy()方法向servlet指示servlet正在停止服務。 只有在servlet的服務方法中的所有線程都已退出或超時期限過后,才會調用此方法。 在servlet容器調用destroy()方法之后,它不會再在“THIS SERVLET”上調用服務方法。

servlet容器不需要在任何特定時間段內加載servlet。 對於servlet容器的生命周期(可能是幾天,幾個月或幾年),或者介於兩者之間的任何時間量,servlet實例可以在servlet容器中保持活動狀態一段時間。

當servlet容器確定應該從服務中刪除servlet時,它調用Servlet接口的destroy方法以允許servlet釋放它正在使用的任何資源並保存任何持久狀態。 例如,容器可以在想要節省內存資源時或在關閉時執行此操作。

在servlet容器調用destroy方法之前,它必須允許當前在servlet的service方法中運行的任何線程完成執行,或超過服務器定義的時間限制。

在servlet實例上調用destroy方法后,容器可能不會將其他請求路由到該servlet實例。

如果容器需要再次啟用servlet,則必須使用servlet類的新實例。

暫無
暫無

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

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