【问题标题】:How long can a Java servlet instance be expected to persist? Does the same instance serve all clients? Can there be multiple instances?Java servlet 实例可以持续多久?同一个实例是否为所有客户端提供服务?可以有多个实例吗?
【发布时间】:2011-09-08 16:42:58
【问题描述】:

我正在尝试了解 Java servlet 生命周期。

Java servlet 实例可以持续多久?这有多可靠?同一个实例是否为所有客户端提供服务?或者同一个 servlet 类的多个实例可以由不同的客户端生成吗?有没有办法强制保证同一个 servlet 实例永远存在(只要服务器打开)并且同一个 servlet 实例为所有客户端提供服务?还是已经保证会是这样?

【问题讨论】:

标签: java servlets client instance lifecycle


【解决方案1】:

servlet 类只有一个实例,规范保证了这一点。

但是您不应该在 servlet 实例字段中存储任何内容。这至少不是线程安全的:

  • 如果您需要每个请求的内容,请将其存储为请求属性
  • 如果您需要全局的东西,请将其存储为 ServletContext 属性

【讨论】:

  • 我要补充一点,AFAIK 并不保证它在应用程序的整个生命周期中都是同一个实例。
  • @Dave:仅当它实现了自 Servlet 2.4 (2003) deprecated SingleThreadModel 以来,现在没人应该使用它。
  • 规范中有吗?我已经有一段时间没看了,但我不记得有任何东西会阻止容器破坏 servlet 实例并启动一个新实例。
  • 在非集群环境中,据我所知,它在规范中
【解决方案2】:

您有一个实例为该 Servlet 的所有请求提供服务。因此,它必须以reentrant 方式编程(它不是线程安全的)。

现在,您应该了解 servlet 中的线程如何工作以了解全局。

最初存在 SingleThreadModelInterface,但一旦开发人员发现序列化请求在性能方面不是一个好主意,就被弃用了;)

最后,Web 服务器通常有一个线程池,这些线程池在“每个连接的线程”模型中被回收。最近,this is being replaced 使用“每个请求的线程”和异步处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-30
    • 2014-08-11
    • 2020-09-13
    • 2019-09-27
    • 1970-01-01
    • 2018-04-23
    • 2012-05-03
    • 1970-01-01
    相关资源
    最近更新 更多