WSJPA FastPath の構成
Java™ Persistence API (JPA) は、リレーショナル・データを Java オブジェクト・フォームに変換する方法について実装者のためのガイドラインを提供する、非常に柔軟な仕様です。 この API の柔軟な特性のため、リレーショナル・データをオブジェクト形式に正しくロードする方法を決定するために、大量の処理が API プロバイダーによって実行時に実行されます。この柔軟性により、ランタイムにおける特定の状況下で、データを正しくロードするために冗長なコードを連続して実行しなければなりません。 この柔軟性の一部を使用しないと、WSJPA FastPath 最適化でこの冗長コードの大部分のスキップが試みられ、JDBC 層と直接やり取りする高度に最適化されたコードが生成されます。この最適化により、パフォーマンスが向上します。
このタスクについて
こうしたコード・パスの最適化は複雑な処理であるため、すべてのドメイン・モデルが WSJPA FastPath 最適化の要件を満たすわけではありません。
ファスト・パス・フィーチャーを使用すると、一部のアプリケーションのパフォーマンスを改善できます。 対象となるのは、自分自身のデータを受け入れ可能な形式にモデル化してあり、拡張 JPA フィーチャーを使用しないアプリケーションです。
public Customer findCustomer(int id) {
return em.find(Customer.class, id);
}
この例は、Customer エンティティーを検索する単純なヘルパー・メソッドです。findCustomer メソッドが開始されるたびに、JPA ランタイムが大量のコードを実行して、要求の分析、データベースへのアクセス、および Customer エンティティーのロードを実行します。 FastPath 最適化を使用しないと、ロジックのほとんどは 2 番目以降の findCustomer メソッドの実行で同一になります。最初の実行からのランタイム決定は、ごくわずかしか findCustomer メソッドの後続の呼び出し用に保持されません。この冗長コード処理は、一部のシナリオでパフォーマンスの問題の原因となる可能性があります。
10855 fp_pu INFO [main] FP - Successfully generated FastPath com.ibm.ws.persistence.fastpath.entities.Customer$Find$FastPath@1f6b69d7".
このメッセージがログに記録されると、Customer を検索する後続の実行ではすべてこの新しく生成されたパスが使用されます。
前の例では、ファインダー・パスがどのように実行されるかの概要を示しました。また FastPath ではフィールド (関係と関係以外) の LAZY ロードおよび NamedQueries の実行の最適化も試みられます。
FastPath の構成:
パーシスタンス・ユニット・プロパティー wsjpa.FastPath=true が設定されていると、JPA ランタイムは、どのオペレーションを安全に処理できるかを決定しようとします。FastPath を使用して実行されるオペレーションを明示的に構成するには、Include プロパティーおよび Exclude プロパティーを使用できます。
<property name=”openjpa.MetaDataRepository” value=”Preload=true”/>
<property name=”wsjpa.FastPath”
value=”true(Include=’<path>;,<path>;...’;Exclude=’<path>,<path>...’)”>
- ファインダー: <完全修飾エンティティー名> (com.ibm.ws.jpa.Customer など)
- LAZY ロードされたフィールド: <完全修飾フィールド名> (com.ibm.ws.jpa.Customer.cars など)
- 名前付き照会: <完全照会名> (com.ibm.ws.jpa.customer_find_by_id など)
- プロパティー (Include/Exclude) が指定されていない場合、ランタイムはすべてのパーシスタント・タイプをスキャンして、処理できるパスを判別しようとします。
- Include プロパティーが指定されている場合、指定されたパスのみが処理され、Exclude プロパティーは無視されます。
- Exclude プロパティーが指定されている場合、除外リストにないすべてのパスの処理が試みられます。
- フィールドが除外リストにあり、そのフェッチ・タイプが EAGER である場合、そのフィールドは、 LAZY ロードされることがないため無視されます。
<property name="wsjpa.FastPath" value="false"/>
この例では、false がデフォルト値です。デフォルトでは、この最適化はオンになりません。<property name="wsjpa.FastPath" value="true"/>
ランタイムは、すべてのエンティティーを処理して、最適化できるファインダー、 LAZY ロード・オペレーション、および名前付き照会を判別しようとします。<property name="wsjpa.FastPath" value="true(Exclude=com.ibm.ws.jpa.entities.Customer.address,customer.findById"/>
例 2 と同じですが、Customer.address フィールドの LAZY ロードは除かれ、また名前付き照会 customer.findById は FastPath 処理から除外されています。<property name="wsjpa.FastPath" value="true(Include=com.ibm.ws.jpa.entities.Customer, customer.findById"/>
処理されるオペレーションは、Customer の検索と NamedQuery ‘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 コールバック
- 区切り ID
- 以下の結果となるパスの実行
- ManyToMany フィールドのフェッチ。
- マップまたは配列として実装されたコレクションのフェッチ。
- 結果として結合テーブルでの結合となる SQL ステートメントの実行
- 結果として同じ結合テーブルでの複数回の結合となる SQL ステートメントの実行。すなわち同じエンティティーに対して複数の EAGER OneToOne 関係を持つエンティティーができます。
- 複数レベルの EAGER 関係のロード。例えば {A->(eager)B->(eager)C}
- NamedQuery でのメソッド setFirst、setFlush、setHind、setLockMode、および setMax の呼び出し。
- PureQuery を使用する JPA アプリケーションとの非互換性。
- アクセス・インテントを使用する JPA アプリケーションとの非互換性。
- JPA によるデータのフェッチ方法を変更するプロパティーの実行時設定。