每个请求是否访问相同的 Servlet 对象?

2022-09-02 04:10:33

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


答案 1

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

从 Servlet 3.0 规范中可以看出:

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

...

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


答案 2

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

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


推荐