配置 WSJPA FastPath
Java™ 持久性 API (JPA) 是一个很灵活的规范,它指导实现程序如何将关系数据转换为 Java 对象表单。因为此 API 的灵活特质,确定如何正确地将关系数据装入到对象表单中的大量工作由 API 提供程序在运行时完成。此灵活性会导致运行时在某些情况下必须持续运行冗余代码以确保数据正确装入。通过放弃一定的灵活性,WSJPA FastPath 优化尝试跳过大部分冗余代码并生成高度优化代码以直接与 JDBC 层交互。此优化可提高性能。
关于此任务
优化这些代码路径是一个复杂的过程,因此,并非所有域模型都满足 WSJPA FastPath 优化的要求。
Fastpath 功能可改进某些应用程序的性能,这些应用程序的数据以可接受格式建模并且未使用扩展 JPA 功能。
public Customer findCustomer(int id) {
return em.find(Customer.class, id);
}
此示例是一个简单的 helper 方法,用于查找 Customer 实体。每次启动 findCustomer 方法时,JPA 运行时都会运行大量代码以分析请求、访问数据库和装入 Customer 实体。因为未使用 FastPath 优化,所以大部分逻辑对于 findCustomer 方法的第二次执行和后续执行是完全相同的。第一次执行中的极少运行时决策被保留下来,以供将来调用 findCustomer 方法。在某些场景中,此冗余代码处理可能导致性能问题。
10855 fp_pu INFO [main] FP - Successfully generated FastPath com.ibm.ws.persistence.fastpath.entities.Customer$Find$FastPath@1f6b69d7".
如果记录了此消息,那么查找 Customer 的所有将来调用都会使用新生成的路径。
先前示例概述如何执行查找程序路径。FastPath 还会尝试优化字段(关系和非关系)的延迟装入和执行指定查询。
配置 FastPath:
如果设置了持久性单元属性 wsjpa.FastPath=true,那么 JPA 运行时会尝试确定如何安全地处理操作。可使用 Include 和 Exclude 属性来显式配置要使用 FastPath 执行的操作。
<property name=”openjpa.MetaDataRepository” value=”Preload=true”/>
<property name=”wsjpa.FastPath”
value=”true(Include=’<path>;,<path>;...’;Exclude=’<path>,<path>...’)”>
- 查找程序: <Fully qualified Entity name>(例如,com.ibm.ws.jpa.Customer)
- 延迟装入的字段: <Fully qualified field name>(例如,com.ibm.ws.jpa.Customer.cars)
- 指定查询: <Full query name>(例如,com.ibm.ws.jpa.customer_find_by_id)
- 如果未指定属性 (Include/Exclude),那么运行时会扫描所有持久性类型并尝试确定可处理的路径。
- 如果指定了 Include 属性,那么只会处理指定的路径,并且 Exclude 属性被忽略。
- 如果指定了 Exclude 属性,那么系统会尝试处理 Exclude 列表中未包括的所有路径。
- 如果 Exclude 列表中提供了字段,并且该字段的访存类型为 EAGER,那么该字段会被忽略,因为该字段决不会延迟装入。
<property name="wsjpa.FastPath" value="false"/>
在此示例中,false
是缺省值;缺省情况下不会开启此优化。<property name="wsjpa.FastPath" value="true"/>
运行时会处理所有实体并尝试确定可优化的查找程序、延迟装入操作和指定查询。<property name="wsjpa.FastPath" value="true(Exclude=com.ibm.ws.jpa.entities.Customer.address,customer.findById"/>
与示例 #2
中一样,但进行 FastPath 处理时不会延迟装入 Customer.address 字段和指定查询 customer.findById。<property name="wsjpa.FastPath" value="true(Include=com.ibm.ws.jpa.entities.Customer, customer.findById"/>
仅处理查找 Customer 和执行指定查询“customer.findById”的操作。所有其他操作都是使用常规 JPA 运行时执行的。限制:
- 与 openjpa.DataCache 属性不兼容。
- 与 openjpa.FetchPlan 属性不兼容。
- 将 LockModeType 和/或属性映射传递至 EntityManager 查找方法。
- 定制字段策略
@org.apache.openjpa.persistence.Factory, @javax.persistence.SecondaryTable,
@org.apache.openjpa.persistence.Externalizer,
@org.apache.openjpa.persistence.ExternalValues,
@org.apache.openjpa.persistence.LRS, @java.sql.Lob, @java.sql.Clob, @java.sql.Blo- XML 列映射
- 可嵌入项
- 仅支持单表继承。
- @javax.persistence.PostLoad 回调
- 定界标识
- 执行路径,此操作导致以下操作:
- 访存 ManyToMany 字段。
- 访存作为映射或数组实现的集合。
- 执行导致对连接表执行连接的 SQL 语句
- 执行 SQL 语句,此操作导致多次对同一个表执行连接。即,所具有的实体与同一个实体存在多个 EAGER 一对一关系。
- 装入多个级别的 EAGER 关系。例如,{A->(eager)B->(eager)C}
- 对指定查询调用以下方法:setFirst、setFlush、setHind、setLockMode 和 setMax。
- 与使用 Purequery 的 JPA 应用程序不兼容。
- 与使用访问意向的 JPA 应用程序不兼容。
- 在运行时设置任何更改 JPA 访存数据的方式的属性。