调用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的新实例并执行所有生命周期操作,直到再次提供请求为止。
几个案例:
- 当容器关闭或应用程序关闭时;
- 当容器决定内存不足时;
- 当这个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即将被销毁)。 因此,如果您想要做某事(例如:清理资源),您可以在此回调下执行这些操作。