为什么要池无状态会话 Bean?

2022-09-01 14:34:39

Java 中的无状态 Bean 不会在来自客户端的两次调用之间保持其状态。因此,简而言之,我们可以将它们视为具有业务方法的对象。每个方法都采用参数并返回结果。调用该方法时,将在执行堆栈中创建一些局部变量。当该方法返回时,将从堆栈中删除局部变量,如果分配了一些临时对象,则无论如何都会对它们进行垃圾回收。

从我的角度来看,这与通过单独的线程调用同一单个实例的方法没有什么不同。那么,为什么容器不能使用一个 Bean 的一个实例,而不是池化多个 bean 呢?


答案 1

池化可以做几件事。

首先,通过每个实例有一个Bean,可以保证线程安全(例如,Servlet不是线程安全的)。

第二,您可以减少Bean可能具有的任何潜在启动时间。虽然会话 Bean 是“无状态的”,但它们只需要在客户端方面是无状态的。例如,在 EJB 中,可以将多个服务器资源注入到会话 Bean 中。这种状态对豆子来说是私有的,但是你没有理由不能阻止它从调用到调用。因此,通过池化 Bean,您可以将这些查找减少到仅在创建 Bean 时发生。

第三,您可以使用Bean pool作为限制流量的手段。如果池中只有 10 个 Bean,则最多只能同时处理 10 个请求,其余的将排队。


答案 2

池化可增强性能。

处理所有请求/线程的单个实例将导致大量争用和阻塞。

由于您不知道将使用哪个实例(并且多个线程可以同时使用单个实例),因此 Bean 必须是线程安全的。

容器可以根据实际活动管理池大小。


推荐