EJB 容器调整

如果您使用的应用程序会影响 Enterprise JavaBeans (EJB) 容器高速缓存的大小,那么错误的大小设置可能会影响应用程序性能。虽然 EJB 3.x 模块中不支持实体 bean(这点很重要),但是本主题中仍讨论了容器管理的持久性 (CMP)。

EJB 高速缓存大小

监视 Tivoli® Performance Viewer 可以诊断是否为应用程序正确地调整了 EJB 容器高速缓存大小设置。

如果应用程序已填充导致发生回收的高速缓存,那么 Tivoli Performance Viewer 将显示非常高的 ejbStores 调用比率,并可能显示比工作站上期望的处理器利用率更低的利用率。

如果以下公式的结果超过 2000,那么所有使用企业 Bean 的应用程序都应根据缺省值调整此设置:
EJB_Cache_Size =(参与事务的选项 B 或 C 实体 Bean
的最大数目 * 并发事务的最大数目)+
(期望在典型应用程序工作负载期间访问的唯一选项 A 实体 Bean
的最大数目)+
(典型工作负载期间处于活动状态的有状态会话 Bean 的数目)+
(典型工作负载期间使用的无状态会话 Bean 类型的数目)

其中:选项 B 和 C 实体 Bean 仅在它们所参与事务的生存期内保存在 EJB 高速缓存中。因此,该公式中的第一项
用于计算这些类型的 Bean 的平均 EJB 高速缓存需求。

选项 A 实体 Bean 无限期地保存在 EJB 高速缓存中,并且仅当高速缓存中存在的
Bean 开始超过所设置的高速缓存大小时,才会从高速缓存中除去该实体 Bean。如果应用程序使用“只读”Bean,那么对于此调整计算,将这些 Bean 视为选项 A Bean。

有状态会话 Bean 将保存在 EJB 高速缓存中,直到应用程序将它们
除去或达到它们的会话超时值为止。

对于每个 EJB 类型,所有方法都在单个无状态会话 Bean 上运行期间,
只有该会话 Bean 的一个实例将保存在高速缓存
中。如果要同时在同一无状态会话 Bean 类型上实现两个或多个
方法,那么每种方法都将在其自己的 Bean 实例上运行,
但仅有一个高速缓存位置用于所有这些实例。

此公式计算应用程序服务器内同时处于活动状态的企业 Bean 的最大数上限。由于针对性能优化构建了 EJB 容器高速缓存以包含所有这些 Bean,因此通过将此高速缓存大小设置为大于上述公式计算出的数值,可以获得最佳性能。

您可以在管理控制台中的服务器 > 服务器类型 > WebSphere 应用程序服务器 > server_name > EJB 容器设置 > EJB 高速缓存设置下设置 EJB 高速缓存大小。

另外,在调整 EJB 高速缓存大小时,可以调整 EJB 容器管理线程参数以满足应用程序的需要。通过清除时间间隔设置来控制管理线程。此设置控制 产品内的守护程序线程尝试从高速缓存除去最近未使用的 Bean 实例以尝试使 Bean 实例数保持不超过高速缓存大小的频率。此行为确保了 EJB 容器尽快确定和查找高速缓存中的项。使此时间间隔设置为缺省值,但在某些情况下,可能有必要确定减少此时间间隔是否有所帮助。

有关使用 EJB 高速缓存跟踪服务来调整 EJB 高速缓存的信息,请阅读调整 EJB 高速缓存及使用跟踪服务的相关内容。

EJB 有状态会话 Bean 调整

有状态会话 Bean 超时可以通过多种方式并使用不同的范围进行配置,具体取决于 WebSphere® Application Server 的版本。

WebSphere Application Server V6.1 和更低版本支持使用 ibm-ejb-jar-ext.xmi 文件配置每个 Bean 的有状态会话 Bean 超时。

WebSphere Application Server V7.0 支持使用 ibm-ejb-jar-ext.xmi 文件(适用于 EJB 2.x 模块)和 ibm-ejb-jar-ext.xml 文件(适用于 EJB 3.x 模块)配置每个 Bean 的有状态会话 Bean 超时。

WebSphere Application Server V8.x 支持使用 ibm-ejb-jar-ext.xmi 文件(适用于 EJB 2.x 模块)和 ibm-ejb-jar-ext.xml 文件(适用于 EJB 3.x 模块)以及有状态超时 XML 元素和 @StatefulTimeout 注释来配置每个 Bean 的有状态会话 Bean 超时。此外,您可以使用 com.ibm.websphere.ejbcontainer.defaultStatefulSessionTimeout 系统属性来配置服务器范围(全局)有状态会话超时值。

支持的配置 支持的配置: 对于 IBM® 扩展文件和绑定文件,根据您使用的是 Java EE 5 之前的应用程序或模块还是 Java™ EE 5 或之后的应用程序或模块,.xmi 或 .xml 文件扩展名有所不同。IBM 扩展文件或绑定文件将命名为 ibm-*-ext.xmi 或 ibm-*-bnd.xmi,其中 * 是扩展文件或绑定文件的类型,例如,app、application、ejb-jar 或 web。存在下列条件:
  • 对于使用 V5 之前的 Java EE 版本的应用程序或模块,文件扩展名必须是 .xmi。
  • 对于使用 Java EE 5 或更高版本的应用程序或模块,文件扩展名必须是 .xml。如果应用程序或模块中包含 .xmi 文件,那么产品将忽略这些 .xmi 文件。

然而,Java EE 5 或更高版本的模块可以在包含 Java EE 5 之前的文件并使用 .xmi 文件扩展名的应用程序中存在。

ibm-webservices-ext.xmiibm-webservices-bnd.xmiibm-webservicesclient-bnd.xmiibm-webservicesclient-ext.xmiibm-portlet-ext.xmi 文件继续使用 .xmi 文件扩展名。

sptcfg

无状态会话 Bean 不包含超时值,因为它们没有会话式状态且并非专用于任何特定的客户机。

您可以使用 Rational® Application Developer 来更新 ibm-ejb-jar-ext.xmi 文件,该文件用于配置 EJB 2.x 模块中的 Bean 的有状态会话超时值。有关更多信息,请阅读 Rational Application Developer 信息中心中定义 Bean 的会话超时设置的相关内容。

例如,用于将有状态会话超时值设置为 15 分钟的已生成 XMI 代码如下:
<ejbExtensions xmi:type="ejbext:SessionExtension" xmi:id="SessionExtension_1"
  timeout="15">

您可以修改 ibm-ejb-jar-ext.xml 文件以设置 EJB 3.x 模块中的 Bean 的有状态会话超时。例如,用于将 myBean Bean 的有状态会话超时值设置为 15 分钟的代码如下:

<ejbExtensions xmi:type="ejbext:SessionExtension" xmi:id="SessionExtension"
  timeout="15">
    <enterpriseBean xmi:type="ejb:Session" href="META-INF/ejb-jar.xml#MyBean"/>
 </ejbExtensions>

您可以使用 @StatefulTimeout 注释来配置有状态会话 Bean 超时。@StatefulTimeout 注释接受表示超时持续时间的必需值参数以及可选单位参数。如果未指定可选单位参数,那么缺省单位是分钟。@StatefulTimeout 注释是在 EJB 3.1 中引入的。

例如,可以使用 @StatefulTimeout 注释声明超时值为 100 秒:

@StatefulTimeout(value=100 unit=java.util.concurrent.TimeUnit.SECONDS)

您可以使用 ejb-jar.xml 部署描述符中的有状态超时 XML 元素来配置有状态会话 Bean 超时。有状态超时元素是在 EJB 3.1 中引入的。

例如,要将超时值设置为 100 秒,请使用以下元素:

<stateful-timeout>
     <timeout>100</timeout>
     <unit>Seconds</unit>
</stateful-timeout>

@StatefulTimeout 注释和有状态超时 XML 元素是用于声明每个 Bean 的超时值的规范定义机制,从 EJB 3.1 中引入。在 EJB 3.1 之前,没有用于定义每个 Bean 的有状态会话超时的规范定义方式。 使用有状态超时 XML 元素或 @StatefulTimeout 注释时,值 -1 表示 Bean 永远不会超时,而值 0 表示可以立即除去的 Bean。

您可以使用 com.ibm.websphere.ejbcontainer.defaultStatefulSessionTimeout 系统属性对有状态会话 Bean 超时进行全局(服务器范围)配置。com.ibm.websphere.ejbcontainer.defaultStatefulSessionTimeout 的时间单位是分钟。指定的值必须至少为 0,并且如果指定了无效值,那么将改为使用缺省值 10 分钟。全局超时值无法使用 XML 或注释进行配置。全局超时值适用于服务器中运行的所有有状态会话 Bean,包括 EJB 2.x 或 EJB 3.x 模块中的有状态会话 Bean。

在 WebSphere Application Server V8.x 中,Bean 级别有状态超时设置优先于服务器范围超时设置。服务器范围超时设置优先于缺省(未指定)超时。 以下优先顺序用于确定 WebSphere Application Server V8.x 中运行的 Bean 的有状态会话超时值:
  1. 有状态超时 XML 元素
  2. @StatefulTimeout 注释
  3. ibm-ejb-jar-ext.xmlibm-ejb-jar-ext.xmi
  4. com.ibm.websphere.ejbcontainer.defaultStatefulSessionTimeout 系统属性
  5. 如果未明确指定 Bean 级别或服务器范围超时值,那么将应用缺省超时值 10 分钟。

Dcom.ibm.websphere.ejbcontainer.poolSize

如果应用程序正在使用池中的大部分 Bean 实例,那么 Tivoli Performance Viewer 将指明这一点。如果使用了大多数 Bean 实例,请通过在 JVM 的定制属性标记中添加此参数来增加要耗尽的这些 Bean 池的大小;例如:

-Dcom.ibm.websphere.ejbcontainer.poolSize=<application_name>#<module_name>#
<enterprisebean_name>=<minSize>,<maxSize>

其中:

<application_name> 元素是企业归档 (EAR) 文件部署描述符中定义的 Java EE 应用程序名称,该部署描述符用于要设置其池大小的 Bean。

<module_name> 元素是 EJB 模块的 Java 归档 (JAR) 文件名,该模块用于要设置其池大小的 Bean。

<bean_name> 元素是 EJB 模块部署描述符中定义的 Java EE 企业 Bean 名称,该部署描述符用于要设置其池大小的 Bean。

<minSize> 元素是容器在池中保持的 Bean 实例数,不考虑 Bean 在池中保持的时间(随着时间的过去,将从此池中除去超过此数目的 Bean 以优化内存使用率)

<maxSize> 元素是池中的 Bean 实例数,在使用这些 Bean 实例后不再将更多的 Bean 实例放入池中(即,池达到此大小后,将废弃任何其他 Bean 而不是将它们添加到池中 - 这将确保池中的 Bean 数有一个上限,以便内存使用率不会无限增大)。

要使池中的实例数保持固定大小,可以将 minSize 和 maxSize 设置为相同值。在应用程序服务器中运行的每个 EJB 类型都有一个单独的实例池,并且每个池都可以在没有实例的情况下启动;使用 Bean 并将它们放入池中时实例数将增长。

当容器需要 Bean 实例而池中没有 Bean 可用时,容器将创建一个 Bean 实例并使用它,然后将该实例放入池中(除非池中已经达到 maxSize 实例数)。例如,语句
Dcom.ibm.websphere.ejbcontainer.poolSize=ivtApp#ivtEJB.jar#ivtEJBObject=125,1327  
将应用程序 ivtApp 的 ivtEJB.jar 文件中名为 ivtEJBObject 的 Bean 的 minSize 设置为 125,将 maxSize 设置为 1327

应用程序 ivtApp 将替换为实际的应用程序名称,ivtEJB.jar 文件将替换为包含必须增大其池大小的 Bean 的 JAR 文件,而 ivtEJBObject 是必须增大其池大小的企业 Bean 的名称。池中保存的 Bean 的最小数为 125。池中保存的 Bean 的最大数为 1327。设置这些值,以便池中不再发生回收。在大多数情况下,如果内存足够多,那么应将它们设置为相等的值,因为池的大小不会发生变化。

Dcom.ibm.websphere.ejbcontainer.noPrimaryKeyMutation

您应该了解应用程序如何处理主键对象的创建以供产品中的 CMP Bean 和 Bean 管理的持久性 (BMP) Bean 的使用。

EJB 容器使用实体 Bean 的主键作为内部数据结构中的标识来优化性能。但是,EJB 容器必须在第一次访问 Bean 时复制这些主键对象,以确保内部高速缓存中存储的对象与应用程序中使用的那些对象分离开。如果应用程序更改或改变主键,那么此过程可以用于保持内部结构一致。如果在创建了用于创建和访问实体 Bean 的主键后应用程序不会改变任何这些主键,那么可以使用特殊标志来确保 EJB 容器跳过主键对象的复制,从而保存处理器周期并提高性能。可以通过将 –D 属性添加到 JVM 定制属性字段来启用此机制,风险由您自己承担。
-Dcom.ibm.websphere.ejbcontainer.noPrimaryKeyMutation=true
支持的配置 支持的配置: EJB 3.x 和更高版本的模块中不支持实体 Bean。sptcfg

此优化的性能益处取决于应用程序。如果应用程序使用企业 Bean 主键的基本类型,那么不会获得任何增益,因为这些对象保持不变,并且复制机制将考虑这一点。但是如果应用程序使用很多复合体主键(即主键或多字段的对象),那么此参数可以显著地改进性能。

Dcom.ibm.ws.pm.deferredcreate

EJB 容器使用持久性管理器来保持从 CMP 实体 Bean 到数据库数据的持续性。

当通过调用 ejbCreate 方法创建实体 Bean 时,缺省情况下,持久性管理器立即只将数据库中的主键插入到空行中。在大多数情况下,创建 Bean 后,您必须修改所创建的 Bean 或同一事务内部的其他 Bean 中的字段。如果您要将对数据库的插入操作推迟到事务结束时以排除数据库的单程访问,那么在 JVM 定制属性字段内部设置 –D 标志。将数据插入到数据库并保持一致性。
支持的配置 支持的配置: EJB 3.x 和更高版本的模块中不支持实体 Bean。sptcfg
-Dcom.ibm.ws.pm.deferredcreate=true

此优化的性能益处取决于应用程序。如果密集插入 EJB 应用程序事务,那么应用程序可从此优化中获益。如果应用程序执行较少的插入,那么使用此优化意义不大。

Dcom.ibm.ws.pm.batch

EJB 应用程序根据在 Bean 上执行的操作(例如更新、插入和读取)来访问单一事务内的多个 CMP Bean 时,发布到数据库的操作数将直接对应于在 CMP Bean 上执行的操作。如果您使用的数据库系统支持对更新语句进行批处理,那么可以在与数据库的所有在单个事务中涉及两个以上的更新操作的交互中,启用此标志来提高性能。

支持的配置 支持的配置: EJB 3.x 和更高版本的模块中不支持实体 Bean。sptcfg
使用此标志,这支持持久性管理器将所有更新语句添加至发布到数据库的一个单一批处理语句中。此过程将保存对数据库的往返访问,从而提高性能。如果您知道应用程序具有更新单一事务中多个 CMP Bean 的行为并且数据库支持批量更新,那么可以在 JVM 定制属性字段内设置 –D 标志;例如:
-Dcom.ibm.ws.pm.batch=true

此优化的性能益处取决于应用程序。如果应用程序从不或很少更新 CMP Bean,或者只更新每个事务的单个 Bean,那么不会带来性能增益。如果应用程序更新每个事务的多个 bean,那么此参数会有助于提高应用程序性能。

下表列出支持批处理更新的后端数据库。
表 1. 支持批处理更新的后端数据库. 下表列出支持批处理更新的后端数据库。
数据库 支持批处理更新 支持使用乐观并发控制的批处理更新
DB2®
Oracle
DB2 通用驱动程序
Informix®
SQLServer
Apache Derby
支持的配置 支持的配置: 即使访问意向指定了使用 OCC 进行批处理更新,也不能对不支持这种更新的数据库执行这种更新。sptcfg

com.ibm.ws.pm.useLegacyCache

指定产品实现 javax.rmi.CORBA.UtilDelegate 接口所使用的 Java 类的名称。

支持的配置 支持的配置: EJB 3.x 和更高版本的模块中不支持实体 Bean。sptcfg
持久性管理器包含两种类型的高速缓存机制,传统高速缓存两级高速缓存。通常,由于在两级高速缓存方式下进行了优化,因此该方式的效率高于传统高速缓存。虽然建议使用两级高速缓存,但缺省值为传统高速缓存。通过系统属性设置此配置,如下所示:
com.ibm.ws.pm.useLegacyCache=false

com.ibm.ws.pm.grouppartialupdate 和 com.ibm.ws.pm.batch

在某些情况下,部分更新功能可以提高带有企业 Bean 的应用程序的性能。持久性管理器包含两种高速缓存机制,传统高速缓存两级高速缓存。由于在两级高速缓存这种方式下进行了优化,所以它的性能通常优于传统高速缓存。

支持的配置 支持的配置: EJB 3.x 和更高版本的模块中不支持实体 Bean。sptcfg
在某些必须同时执行批处理更新和部分更新的应用程序中,您必须配置以下系统属性才能获得这两种更新方式的增益:
'com.ibm.ws.pm.grouppartialupdate=true' and 'com.ibm.ws.pm.batch=true'

指示主题类型的图标 参考主题



时间戳记图标 最近一次更新时间: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=rprf_ejbcontainer
文件名:rprf_ejbcontainer.html