为什么池无状态会话bean?

And*_*кин 27 java ejb stateless-session-bean pooling

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

从我的观点来看,它与通过单独的线程调用同一单个实例的方法没有区别.那么为什么容器不能使用bean的一个实例而不是汇集其中的一个?

Wil*_*ung 28

合并做了几件事.

一,通过每个实例有一个bean,你可以保证线程安全(例如,Servlets不是线程安全的).

二,减少bean可能具有的任何潜在启动时间.虽然会话豆是"无国籍的",但它们只需要对客户端无国籍.例如,在EJB中,您可以将多个服务器资源注入会话Bean.该状态对bean是私有的,但是没有理由不能将它从调用保持到调用.因此,通过池化bean,您可以将这些查找减少到仅在创建bean时发生.

三,您可以使用bean池作为节流量的手段.如果池中只有10个Bean,那么您最多只能获得10个同时工作的请求,其余的将排队等候.

  • 可能更清楚地说开发人员负责编写线程安全的servlet - 会有多个线程同时命中它.无状态会话bean不需要写成线程安全,因为容器已经保证了这一点(不会有多个线程同时执行;而是有多个bean,池化). (6认同)
  • "一,通过每个实例有一个bean,你可以保证线程安全(例如,Servlets不是线程安全的)." 线程安全如何帮助无状态会话bean? (3认同)