第 5 章 EJB 子系统调整
JBoss EAP 可以缓存 Jakarta Enterprise Beans,以节省初始化时间。这通过使用 bean 池来完成。
JBoss EAP 中有两个不同的 bean 池:bean 实例池和 bean 线程池。
适当的 bean 池大小取决于您的环境和应用程序。建议您测试不同的 bean 池大小,并在可模拟您预期实际状况的开发环境中执行压力测试。
5.1. Bean 实例池
Bean 实例池用于无状态会话 Bean(SLSB)和消息 Driven Beans(MDB)。默认情况下,SLSB 使用实例池 default-slsb-instance-pool
,MDB 使用实例池 default-mdb-instance-pool
。
bean 实例池的大小限制了一次可以创建的特定 EJB 的实例数量。如果特定 EJB 的池已满,客户端将阻止并等待实例可用。如果客户端没有在池的 超时
属性中设置的时间内获取实例,则会引发异常。
bean 实例池的大小是使用 derived -size 或
。您可以使用以下值之一 max-
pool-size 来配置的配置
池大小:
-
from-worker-pools
,这表示池的最大大小源自系统上配置的所有工作程序池的总线程大小。 -
from-cpu-count
,这表示最大池大小派生自系统上可用的处理器总数。请注意,这不一定是 1:1 映射,并且可能会由其它因素进行增强。
如果未定义 derived-size
,则 max-pool-size
的值用于 bean 实例池的大小。
derived -size
属性覆盖 max-pool-size
中指定的任何值。gene-size
必须未定义,才能使 max-pool-size
值生效。
您可以将 EJB 配置为使用特定的实例池。这样,可以更精细地控制可供各个 EJB 类型使用的实例。
5.1.1. 创建 Bean 实例池
本节介绍如何使用管理 CLI 创建新的 bean 实例池。您也可以使用管理控制台从 Configuration 选项卡导航到 EJB 子系统,然后选择 Bean Pool 选项卡,来配置 bean 实例池。
要创建新实例池,请使用以下命令之一:
创建带有派生最大池大小的 bean 实例池:
/subsystem=ejb3/strict-max-bean-instance-pool=POOL_NAME:add(derive-size=DERIVE_OPTION,timeout-unit=TIMEOUT_UNIT,timeout=TIMEOUT_VALUE)
以下示例创建一个名为
my_derived_pool
的 bean 实例池,其最大大小从 CPU 数派生,超时为 2 分钟:/subsystem=ejb3/strict-max-bean-instance-pool=my_derived_pool:add(derive-size=from-cpu-count,timeout-unit=MINUTES,timeout=2)
创建具有显式最大池大小的 bean 实例池:
/subsystem=ejb3/strict-max-bean-instance-pool=POOL_NAME:add(max-pool-size=POOL_SIZE,timeout-unit=TIMEOUT_UNIT,timeout=TIMEOUT_VALUE)
以下示例创建一个名为
my_pool
的 bean 实例池,其超时时间最多为 30 秒:/subsystem=ejb3/strict-max-bean-instance-pool=my_pool:add(max-pool-size=30,timeout-unit=SECONDS,timeout=30)
5.1.2. 指定实例池应该使用
您可以通过使用 @org.jboss.ejb3.annotation.Pool 注释,或通过修改 Bean 的
部署描述符来设置特定 bean 将要使用的特定实例池。如需更多信息,请参阅 开发 EJB 应用中的 jboss-ejb3.
xmljboss-ejb3.xml
部署描述符参考。
5.1.3. 禁用默认的 Bean 实例池
可以禁用默认的 bean 实例池,这导致 EJB 默认不使用任何实例池。相反,当线程需要在 EJB 上调用方法时,会创建新的 EJB 实例。如果您不想对创建的 EJB 实例数量有任何限制,这可能很有用。
要禁用默认的 bean 实例池,请使用以下管理 CLI 命令:
/subsystem=ejb3:undefine-attribute(name=default-slsb-instance-pool)
如果 bean 配置为使用特定的 bean 实例池,禁用 default 实例池不会影响 bean 使用的池。