Application Servers汇集无状态EJB的原因是什么?
我可以理解,控制应用程序的工作负载是非常有用的,但是这只能证明将服务器作为FAÇADE与调用者客户端一起汇集。
汇集内部EJB(那些未公开但仅在内部调用以执行业务逻辑)的内容是否有任何好处?而不是使用共享的单个实例(就像Spring一样)。
我至少可以考虑一个缺点:高度使用的内部EJB可能成为瓶颈。
答案 0 :(得分:3)
无状态会话bean EJB不一定是线程安全的。它们可以保存像JMS会话这样的资源,这些资源不能一次与多个线程共享,因此服务器将它们集中在一起,以便它可以同时为同一个bean提供多个请求(JMS资源也是池化的,但我只是为了举例而使用它。)
答案 1 :(得分:3)
我还想知道为什么无状态EJB被合并。但我想知道为什么他们被汇集而不是按需创建和销毁。实例可以重复用于不相关的请求这一事实使无状态bean的实现变得非常复杂(这意味着您必须非常小心使用实例字段),并且我没有看到任何显着的好处。
具体来说,我认为没有任何性能优势。我在JBoss(6,IIRC)中实现了无状态bean,并且它只汇集了bean实例本身;处理方法调用的管道在每次使用时都会从头开始重新创建。这意味着唯一的性能节省是单个对象创建,这应该是一个微不足道的时间。我可以看到它是非平凡的唯一情况是,如果bean获取重量级资源,并在调用之间保持它们。但是,在这种情况下,bean实际上被用作一个美化,管理不善的游泳池;正确的解决方案是直接汇集资源!
现在,EJB已经存在了很长时间。当他们第一次出来时,对象创建很昂贵,所以将它们集中起来是有意义的。但那些日子早已过去。为什么在EJB3中没有丢弃池?