EJB 容器调整
如果您使用的应用程序会影响 Enterprise JavaBeans (EJB) 容器高速缓存的大小,那么错误的大小设置可能会影响应用程序性能。虽然 EJB 3.x 模块中不支持实体 bean(这点很重要),但是本主题中仍讨论了容器管理的持久性 (CMP)。
EJB 高速缓存大小
监视 Tivoli® Performance Viewer 可以诊断是否为应用程序正确地调整了 EJB 容器高速缓存大小设置。
如果应用程序已填充导致发生回收的高速缓存,那么 Tivoli Performance Viewer 将显示非常高的 ejbStores 调用比率,并可能显示比工作站上期望的处理器利用率更低的利用率。
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,因此通过将此高速缓存大小设置为大于上述公式计算出的数值,可以获得最佳性能。
您可以在管理控制台中的
下设置 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 系统属性来配置服务器范围(全局)有状态会话超时值。

然而,Java EE 5 或更高版本的模块可以在包含 Java EE 5 之前的文件并使用 .xmi 文件扩展名的应用程序中存在。
ibm-webservices-ext.xmi、ibm-webservices-bnd.xmi、ibm-webservicesclient-bnd.xmi、ibm-webservicesclient-ext.xmi 和 ibm-portlet-ext.xmi 文件继续使用 .xmi 文件扩展名。
sptcfg无状态会话 Bean 不包含超时值,因为它们没有会话式状态且并非专用于任何特定的客户机。
您可以使用 Rational® Application Developer 来更新 ibm-ejb-jar-ext.xmi 文件,该文件用于配置 EJB 2.x 模块中的 Bean 的有状态会话超时值。有关更多信息,请阅读 Rational Application Developer 信息中心中定义 Bean 的会话超时设置的相关内容。
<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。
- 有状态超时 XML 元素
- @StatefulTimeout 注释
- ibm-ejb-jar-ext.xml 或 ibm-ejb-jar-ext.xmi
- com.ibm.websphere.ejbcontainer.defaultStatefulSessionTimeout 系统属性
- 如果未明确指定 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 并将它们放入池中时实例数将增长。
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 的使用。
-Dcom.ibm.websphere.ejbcontainer.noPrimaryKeyMutation=true

此优化的性能益处取决于应用程序。如果应用程序使用企业 Bean 主键的基本类型,那么不会获得任何增益,因为这些对象保持不变,并且复制机制将考虑这一点。但是如果应用程序使用很多复合体主键(即主键或多字段的对象),那么此参数可以显著地改进性能。
Dcom.ibm.ws.pm.deferredcreate
EJB 容器使用持久性管理器来保持从 CMP 实体 Bean 到数据库数据的持续性。

-Dcom.ibm.ws.pm.deferredcreate=true
此优化的性能益处取决于应用程序。如果密集插入 EJB 应用程序事务,那么应用程序可从此优化中获益。如果应用程序执行较少的插入,那么使用此优化意义不大。
Dcom.ibm.ws.pm.batch
EJB 应用程序根据在 Bean 上执行的操作(例如更新、插入和读取)来访问单一事务内的多个 CMP Bean 时,发布到数据库的操作数将直接对应于在 CMP Bean 上执行的操作。如果您使用的数据库系统支持对更新语句进行批处理,那么可以在与数据库的所有在单个事务中涉及两个以上的更新操作的交互中,启用此标志来提高性能。

-Dcom.ibm.ws.pm.batch=true
此优化的性能益处取决于应用程序。如果应用程序从不或很少更新 CMP Bean,或者只更新每个事务的单个 Bean,那么不会带来性能增益。如果应用程序更新每个事务的多个 bean,那么此参数会有助于提高应用程序性能。
数据库 | 支持批处理更新 | 支持使用乐观并发控制的批处理更新 |
---|---|---|
DB2® | 是 | 否 |
Oracle | 是 | 否 |
DB2 通用驱动程序 | 是 | 是 |
Informix® | 是 | 是 |
SQLServer | 是 | 是 |
Apache Derby | 是 | 是 |

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

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

'com.ibm.ws.pm.grouppartialupdate=true' and 'com.ibm.ws.pm.batch=true'