WSJPA FastPath の構成

Java™ Persistence API (JPA) は、リレーショナル・データを Java オブジェクト・フォームに変換する方法について実装者のためのガイドラインを提供する、非常に柔軟な仕様です。 この API の柔軟な特性のため、リレーショナル・データをオブジェクト形式に正しくロードする方法を決定するために、大量の処理が API プロバイダーによって実行時に実行されます。この柔軟性により、ランタイムにおける特定の状況下で、データを正しくロードするために冗長なコードを連続して実行しなければなりません。 この柔軟性の一部を使用しないと、WSJPA FastPath 最適化でこの冗長コードの大部分のスキップが試みられ、JDBC 層と直接やり取りする高度に最適化されたコードが生成されます。この最適化により、パフォーマンスが向上します。

このタスクについて

注: FastPath は、WSJPA パーシスタンス・プロバイダーによってのみサポートされています。

こうしたコード・パスの最適化は複雑な処理であるため、すべてのドメイン・モデルが WSJPA FastPath 最適化の要件を満たすわけではありません。

ファスト・パス・フィーチャーを使用すると、一部のアプリケーションのパフォーマンスを改善できます。 対象となるのは、自分自身のデータを受け入れ可能な形式にモデル化してあり、拡張 JPA フィーチャーを使用しないアプリケーションです。

例えば、次のコードを検討してください。
public Customer findCustomer(int id) { 
		 		 		 		 return em.find(Customer.class, id); 
}

この例は、Customer エンティティーを検索する単純なヘルパー・メソッドです。findCustomer メソッドが開始されるたびに、JPA ランタイムが大量のコードを実行して、要求の分析、データベースへのアクセス、および Customer エンティティーのロードを実行します。 FastPath 最適化を使用しないと、ロジックのほとんどは 2 番目以降の findCustomer メソッドの実行で同一になります。最初の実行からのランタイム決定は、ごくわずかしか findCustomer メソッドの後続の呼び出し用に保持されません。この冗長コード処理は、一部のシナリオでパフォーマンスの問題の原因となる可能性があります。

em.find(Customer.class,id) の最初の呼び出しで FastPath フィーチャーが有効になっている場合、em.find(Customer, id) に対する後続のすべての呼び出しに置き換わる高度に最適化されたコードが生成されます。この生成されたコードでは、Customer を検索するたびに変更される可能性のあるものは ID のみであることを想定します。 結果として、ほぼ決定不要のコードを生成することができます。最初のメソッド呼び出しで、FastPath 生成が成功すると、次のようなメッセージがログに記録されます。
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 プロパティーを使用できます。

wsjpa.FastPath を構成する場合、openjpa.MetaDataRepository=Preload=true も構成する必要があります。以下に例を示します。
<property name=”openjpa.MetaDataRepository” value=”Preload=true”/>
注: 特定のパスが FastPath ランタイムで最適化できない場合、または Exclude プロパティーで構成されている場合は、そのパスは通常の JPA ランタイム・コードによって実行されます。これは、FastPath 最適化による試験を可能にする重要なフィーチャーです。最適化されていないコード・パスはすべて、機能を失うことなく自動的に元の JPA コード・パスに戻ります。
構成構文 :
<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 ロードされることがないため無視されます。
例 1:
<property name="wsjpa.FastPath" value="false"/>
この例では、false がデフォルト値です。デフォルトでは、この最適化はオンになりません。
例 2:
<property name="wsjpa.FastPath" value="true"/>
ランタイムは、すべてのエンティティーを処理して、最適化できるファインダー、 LAZY ロード・オペレーション、および名前付き照会を判別しようとします。
例 3:
<property name="wsjpa.FastPath" value="true(Exclude=com.ibm.ws.jpa.entities.Customer.address,customer.findById"/>
例 2 と同じですが、Customer.address フィールドの LAZY ロードは除かれ、また名前付き照会 customer.findById は FastPath 処理から除外されています。
例 4:
<property name="wsjpa.FastPath" value="true(Include=com.ibm.ws.jpa.entities.Customer, customer.findById"/>
処理されるオペレーションは、Customer の検索と NamedQuery ‘customer.findById’の実行のみです。他のすべてのオペレーションは、通常の JPA ランタイムを使用して実行されます。

制限:

既に述べたように、FastPath 最適化を使用した完全なパフォーマンス向上の実現に対してはトレードオフがあります。このフィーチャーは広範囲のエンティティー・モデルおよび JPA フィーチャーをサポートしようとしますが、FastPath 最適化でサポートされない数多くのケースが既に知られています。 現時点で既知の制限事項について、以下のリストを参照してください。
  • 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 によるデータのフェッチ方法を変更するプロパティーの実行時設定。

トピックのタイプを示すアイコン タスク・トピック



タイム・スタンプ・アイコン 最終更新: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tejb_jpafastpath
ファイル名:tejb_jpafastpath.html