容器管理的持久性的部分列更新功能
即使仅更改一部分持久属性字段,容器管理的持久性 (CMP) Bean 方法 ejbStore 也会将 CMP Bean 的所有持久属性存储至数据库。这会导致不必要的性能降低,所以此发行版的产品中已经排除了这种做法。
注: 在 EJB 3.0 模块中不支持实体 Bean。
对于 Enterprise JavaBeans (EJB) 2.x CMP 实体 Bean,可使用“部分更新”功能来指定想要如何将 CMP Bean 的持久属性更新至数据库。此功能将作为对该 Bean 配置的访问意向策略中的 Bean 级别持久性选项(称为 PartialOperation)提供。PartialOperation
具有两个可能的值:
- NONE
- 部分更新已关闭。CMP Bean 的所有持久属性将存储至数据库。这是缺省值。
- UPDATE_ONLY
- 指定仅对已更改的 CMP Bean 的持久属性进行数据库的更新。
性能
执行部分更新将通过以下几个方式增强性能:
- 通过降低查询执行时间,这是因为查询中只有这些列的子集。对于带有许多列和索引的表来说,改进的程度会增大。当表具有多个索引时,只有受已更新列影响的索引才需要后端数据库对其进行更新。
- 通过减少网络输入和输出,这是因为要传送的数据较少。
- 通过节省重要映射列的任何处理时间。例如,如果列使用转换器、组合器和变换来部分注入输入记录。
- 通过排除不必要的更新触发器触发。如果 CMP Bean 字段未更改,那么不会触发任何仅取决于相应列的触发器。
虽然部分更新可改进性能,但它也会对性能带来负面影响,如下所示:
- 如果对应用程序在同一时间范围内修改了多个不同的列组合的 Bean 启用部分更新,那么会很快达到连接的预编译语句高速缓存最大值。因此,将根据最早使用时间从高速缓存中逐出语句句柄。这会导致重复地对语句进行预编译,从而降低了所有 CMP 函数(而不仅限于 ejbStore 方法)的性能。
- 函数集中高速缓存的部分更新查询模板将增加内存的使用。此增长与 CMP Bean(部分更新访问意向选项对其设置为开)中的字段数线性相关。
- 因为每个部分查询都不同,所以当 PartialOperation 持久选项与“批处理更新”持久选项一起使用时,将影响批处理更新的性能。动态生成部分更新查询字符串会导致执行时间增加。因为会对每列存储查询片段,所以根据弄脏的 CMP Bean 字段数目,用于组装查询片段的执行成本将按线性方式变化。
- 对于每个 CMP 字段,都会有一些条件检查,例如,检查脏标志和执行 preparedStatement setXXX 方法调用。
有关使用部分更新的注意事项
应该在您希望得到的性能提高与可能发生的性能降低之间进行权衡。可使用下列准则来帮助您作出决策。
- 对于仅涉及简单数据类型并且没有更新触发器的小型表(只有几个列)的应用程序,部分更新可能无法使其受益。动态组装部分查询所付出的成本比所获得的性能收益要高。
- 如果存在不经常更新的复杂数据类型,那么使用部分更新会受益。复杂数据类型的示例为“照片”CMP 属性映射至 BLOB OR VARGRAPHIC 的职员 Bean,或者是通常存储在数据库管理器实现的另一位置中的类似复杂后端类型。
- 如果存在若干 VARCHAR 类型列并且仅更新其中很少几列,那么使用部分更新可能会受益。
- 如果应用程序可能随机更新不同组合的列,并且可指定列(非键列)的数目大于五,那么最好不要使用该部分操作。这会生成许多不同的部分查询,并且会快速填满预编译语句高速缓存。但如果该 Bean 没有太多列(例如,四列或更少)并且它具有复杂数据类型,那么您可能要考虑开启部分更新,并选择增加语句高速缓存大小以应付增长的查询数目。有关增加语句高速缓存大小的信息,请参阅数据源设置帮助。
- 当列的子集需要更新触发器时,使用部分更新很有好处。
- 当表包含许多列和索引,并且典型更新仅涉及较少索引时,使用部分更新很有益。
限制
在缺省情况下,将对启用部分更新的所有 CMP Bean 禁用更新查询的批处理更新。换言之,部分更新优先于批处理更新。删除和插入查询的批处理更新不受影响。
因为每个部分查询都是不同的,所以对相同 Bean 使用批处理更新和部分更新持久性选项时,批处理更新性能会受到影响。可使用 JVM 属性 -Dcom.ibm.ws.pm.grouppartialupdate=true 将类似的部分更新查询分组到一个批处理更新中。仅当事务中存在具有相同形态的若干部分查询时,分组部分更新才会有帮助。但是,分组部分更新对性能有负面影响。因为此设置并非基于 Bean 级别,所以启用此设置时应该小心。由于这会影响同时开启部分更新和批处理更新的所有 Bean,所以您必须确保在查看同时启用了这两种更新的所有 Bean 时,部分查询的批处理更新确实能够提高性能。
要设置 JVM 属性:
- 打开 server.xml 文件。
- 将值 -Dcom.ibm.ws.pm.grouppartialupdate=true 更改为 -Dcom.ibm.ws.pm.grouppartialupdate=false。