调用servlet的destroy方法

根据链接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()代码,这些资源不会被垃圾回收。

从规范( The Servlet Interface -> Servlet Life Cycle -> End of Service ):

在servlet实例上调用destroy方法后,容器可能不会将其他请求路由到该servlet实例。 如果容器需要再次启用servlet,则必须使用servlet类的新实例。

规范指的是正在销毁的servlet的特定实例。

那么,这是否意味着销毁将被调用,它们将不再使用?

这并不意味着永远不会使用其实例被销毁的servlet。 它只是那个没有被使用的特定实例,因为它本来是垃圾收集的。 当请求进入该servlet时,容器将创建该servlet的新实例并执行所有生命周期操作,直到再次提供请求为止。

几个案例:

  1. 当容器关闭或应用程序关闭时;
  2. 当容器决定内存不足时;
  3. 当这个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即将被销毁)。 因此,如果您想要做某事(例如:清理资源),您可以在此回调下执行这些操作。