无状态EJB池和生命周期的摘要视图(注释)。 对新手有用。 。 。 。 。
EJB池:快速概述
- EJB实例存储在称为EJB池的位置–这不过是内存中的缓存 。
- 无状态EJB通常按需实例化,即,当客户端调用Bean上的方法时。
- 但是,大多数应用程序服务器还提供了一种功能,可以对其进行配置,以便在启动时可以使用一定数量的实例(例如,在Weblogic中)填充EJB池,这可以在weblogic-ejb-jar.xml中通过声明以下内容进行配置:空闲池中的初始bean中的确切数字。
合并收益
- 性能提升
- 客户端不需要等到实例化bean即可为请求提供服务
无状态Bean生命周期
NON_EXISTENT –在这种情况下,bean在EJB池中尚不存在(尚未实例化)
不活动 –在这种状态下,EJB实例已经存在于EJB池中,但没有为客户端请求提供服务
BUSY(忙) –调用EJB实例以服务于客户端请求,结果,它进入BUSY状态。
为了服务客户端请求,将调用一个EJB实例,结果,该实例进入BUSY状态。 EJB可以从INACTIVE或NON_EXISTENT状态进入BUSY状态
SLSB状态转换
不忙-顾名思义,池中选择了不活动的bean来满足客户端调用
NON_EXISTENT变为BUSY –创建了一个新的EJB实例来满足客户请求
EJB可以从繁忙状态回到不活动状态,即,在处理了客户端请求之后,实例又回到了池中
在某些情况下,还可以通过配置超时来破坏 EJB实例,该超时迫使应用程序服务器删除池中在特定时间间隔内处于非活动状态的所有EJB实例。 但是,应用服务器确实要确保EJB实例数量不低于允许的实例的最小数量(可配置属性-上面已读)
注意 :这样做主要是为了节省池中的EJB所消耗的内存量,因为它们被缓存在那里。 如果有许多未使用的实例,可以将它们删除以优化内存消耗。 容器可以按需创建新实例
客户端在无状态Bean上调用方法时会发生什么?
场景1 :容器实例化bean的新实例。
可能的原因是
- 开始时, EJB池中没有bean –在服务器启动时,未指示App Server合并默认数量的bean
- EJB池中的所有Bean都在忙于处理来自客户端的请求,但是池中的Bean总数小于允许的最大实例数(配置参数)
场景2 :容器返回了bean的现有实例
可能的原因
- 池中有一定数量的EJB实例可用,并且它们不处于BUSY状态,即它们不参与服务客户机请求。 容器刚刚返回一个这样的实例
- 池中有一定数量的EJB实例,但是它们都处于BUSY状态,并且已经达到了池中最大允许的bean数。 客户端应用程序必须等待,直到一个这样的Bean变为可用并可以满足客户端请求为止
方案3 :客户端请求不是服务(收到异常)
可能的原因
如果已经达到池中允许的最大数量的Bean,并且在特定时间范围内所有BUSY Bean都不可用。
翻译自: https://www.javacodegeeks.com/2014/05/stateless-ejbs-pooling-and-lifecycle.html