![](/img/trans.png)
[英]Calling servlet's init and destroy method withing service method
[英]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()
代碼,這些資源不會被垃圾回收。
幾個案例:
根據文件
由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實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.