【问题标题】:Servlet instances in a web containerWeb 容器中的 Servlet 实例
【发布时间】:2014-09-11 18:21:18
【问题描述】:

Web 容器通常会创建一个线程来处理每个请求。为了确保 servlet 实例一次只处理一个请求,servlet 可以实现 SingleThreadModel 接口。如果 servlet 实现了这个接口,那么在 servlet 的 service 方法中不会有两个线程同时执行。Web 容器可以通过同步访问 servlet 的单个实例或 通过维护 Web 组件实例池和分派来实现这一保证每个对免费实例的新请求。

有人可以澄清以上段落的粗体部分吗?

不是每个 servlet 在 Web 容器中都只有一个实例吗?

【问题讨论】:

  • 在启动时,创建 x (x > 1) 个 servlet 实例。当请求进来时,将请求发送到这些 servlet 实例之一。类似于数据库连接的连接池(概念相似)

标签: java jakarta-ee servlets


【解决方案1】:

不是每个 servlet 在 Web 容器中都只有一个实例吗?

不,这并不总是正确的。 Web 容器管理 servlet 的生命周期(它负责创建和管理 servlet 的实例)。 Java EE 规范不保证您的 servlet 类只有一个实例,因此您不应以依赖于此的方式编写您的 servlet。

正如描述所解释的,如果您的 servlet 实现 SingleThreadModel,则 Web 容器可能会创建您的 servlet 类的多个实例以高效地同时处理请求。

最好以不需要实现 SingleThreadModel 的方式编写 servlet - 以线程安全的方式编写 servlet 代码。

【讨论】:

  • 是否可以限制服务器中servlet实例的数量(在servlet实现SingleThreadModel的情况下)?
  • 远离 SingleThreadModel。严重地。这是一个即时的瓶颈。即使您决定这样做,如果您需要知道实例的数量,那么您做的事情就非常错误。所以不要这样做,即不要在 Servlet 中保留任何状态(或者,如果你真的,真的必须,你可能不会,小心地管理并发访问的共享状态)。
  • @Learner2011 不是标准方式;也许您的特定 Java EE 服务器对其进行了一些设置,但这不是标准的 Java EE 功能。一般来说,这不是您需要担心的事情。让 Web 容器管理 servlet 实例。我同意 kaqqao 的观点:不要以导致您需要此功能的方式编写您的 servlet。使您的 servlet 无状态且线程安全。
  • @Learner2011 您可以在此处获取更多信息:How do servlets work? Instantiation, session variables and multithreading 以及已接受答案中的链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-20
  • 2010-12-26
  • 2020-10-08
  • 2020-11-08
相关资源
最近更新 更多