21

每个 HTTP 请求是否访问相同的 servlet 对象但在不同的线程中?还是创建一个新线程和新的 Servlet 实例?

4

2 回答 2

15

如果您的 servlet 未实现,容器将使用相同的 servlet 实例SingleThreadModel。否则无法保证Servlet命中同一个对象。如果它认为有必要,容器可以自由地创建更多的 servlet 实例。但是请求来自不同的线程,不一定是新创建的(正如 Sanjay 提到的)。

从 Servlet 3.0 规范:

对于不在分布式环境中托管的 servlet(默认设置),servlet 容器必须在每个 servlet 声明中仅使用一个实例。但是,对于实现 SingleThreadModel 接口的 servlet,servlet 容器可能会实例化多个实例来处理繁重的请求负载并将请求序列化到特定实例。

...

通常,Web 容器通过在不同线程上并发执行 service 方法来处理对同一个 servlet 的并发请求。

于 2012-09-20T09:42:52.317 回答
9

每个 HTTP 请求都会创建一个新线程,但会访问同一个 Servlet 实例。

编辑:如果是一个服务器节点,您将在该节点上拥有相同的 Servlet 实例。在负载平衡/许多服务器的情况下,通常每个 Java VM 有一个实例。

于 2012-09-20T09:36:27.670 回答