第 5 章 Jakarta Enterprise Beans 子系统调整
JBoss EAP 可以缓存 Jakarta Enterprise Beans 以节省初始化时间。这通过使用 bean 池来完成。
JBoss EAP 中可以调整两个不同的 bean 池: bean 实例池和 bean 线程池。
适当的 bean 池大小取决于您的环境和应用程序。建议您使用不同的 bean 池大小进行测试,并在模拟预期的真实条件的开发环境中执行压力测试。
5.1. Bean 实例池
Bean 实例池用于无状态会话 Bean (SLSBs)和 Message Driven Beans (MDB)。默认情况下,SLSBs 使用实例池 default-slsb-instance-pool
,MDB 使用实例池 default-mdb-instance-pool
。
bean 实例池的大小限制了一次可以创建的特定企业 bean 的实例数量。如果特定企业 bean 的池已满,客户端将阻止并等待实例变为可用。如果客户端在池 的超时
属性中设置的时间内没有获得实例,则会抛出异常。
使用 derived-size 或 max-pool
来配置 bean 实例池的大小。-size
derived-size
属性允许您使用以下值之一配置池大小:
-
from-worker-pools
,这表示从系统上配置的所有 worker 池的总线程大小派生出的最大池大小。 -
from-cpu-count
,这表示最大池大小派生自系统上可用处理器总数。请注意,这不一定是一个 1:1 映射,可能由其他因素增强。
如果 derived-size
未定义,则 max-pool-size
的值用于 bean 实例池的大小。
derived -size
属性覆盖 max-pool-size
中指定的任何值。derive-size
必须未定义,才能使 max-pool-size
值生效。
您可以将企业 bean 配置为使用特定的实例池。这允许精细控制每个企业 bean 类型可用的实例。
5.1.1. 创建 bean 实例池
本节介绍如何使用管理 CLI 创建新的 bean 实例池。您还可以通过从 Configuration 选项卡导航到 Jakarta Enterprise Beans 子系统,然后选择 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 个实例,超时为 30 秒:/subsystem=ejb3/strict-max-bean-instance-pool=my_pool:add(max-pool-size=30,timeout-unit=SECONDS,timeout=30)
5.1.2. 指定 bean 应该使用的实例池
您可以通过利用 @org.jboss.ejb3.annotation.Pool
注释,或通过修改 bean 的 jboss-ejb3.xml
部署描述符来设置特定的 Bean 将使用它的特定实例池。
5.1.3. 禁用默认的 bean 实例池
可以禁用默认的 bean 实例池,这会导致 enterprise bean 默认不使用任何实例池。相反,当线程需要调用企业 bean 的方法时,会创建一个新的企业 bean 实例。如果您不希望对所创建的企业 bean 实例数量有任何限制,这将非常有用。
要禁用默认的 bean 实例池,请使用以下管理 CLI 命令:
/subsystem=ejb3:undefine-attribute(name=default-slsb-instance-pool)
If a bean is configured to use a particular bean instance pool, disabling the default instance pool does not affect the pool that the bean uses.