Java Persistence API(JPA)は、オブジェクト・リレーショナル・マッピング(ORM)およびエンタープライズJava Persistenceにおける標準です。この章の内容は次のとおりです。
Coherenceでデフォルトのエンティティベースのキャッシュ・ストア実装およびキャッシュ・ローダー実装を使用する方法。これらの実装では、JPAを使用してデータベースにオブジェクトをロードおよび格納します。
TopLink GridでバッキングしたキャッシュでCoherence APIを使用して、EclipseLink JPAにあわせて最適化されたJPAのキャッシュ・ローダー実装とキャッシュ・ストア実装を持つリレーショナル・データにアクセスする方法。
注意: Coherence APIおよびJPAでは、リソース・ローカルおよびブートストラップのエンティティ・マネージャのみを使用できます。コンテナ管理のエンティティ・マネージャ、およびJava Transaction Architecture(JTA)トランザクションを使用するマネージャは、現在サポートされていません。 |
この章では、グリッド基盤のJPAについても簡単に説明します。この構成ではJPAアプリケーションがTopLink Gridを使用してデータベースと直接対話します。それに対して、TopLink GridではCoherenceデータ・グリッドを使用してドメイン・モデルの一部またはすべてを格納します。グリッド基盤のJPAの詳細は、『Oracle TopLinkのためのCoherence Grid統合ガイド』を参照してください。
この章では次の項について説明します。
Oracle Coherenceでは、JPAで使用できるCacheLoader
クラスとCacheStore
クラスの独自実装が提供されています。JpaCacheLoader
クラスとJpaCacheStore
クラスは、任意のJPA実装を使用して、エンティティをデータ・ストアに対してロードおよび格納できます。このエンティティはデータ・ストアにマップされている必要があり、JPA永続性ユニット構成が存在する必要があります。JPA永続性ユニットは、永続化可能なユーザー定義のエンティティ・クラスとそれらの設定からなる論理グループとして定義されます。
Coherenceでは、coherence-cache-config.xml
というデフォルトのキャッシュ構成ファイルも提供されています。JPAランタイム構成ファイルpersistence.xml
と、デフォルトのJPAオブジェクト・リレーショナル・マッピング・ファイルorm.xml
は通常、JPA実装で提供されます。
表1-1は、Coherenceで提供されるデフォルトのJPA実装を示しています。
表1-1 Coherenceに付属するJPA関連のCacheStoreとCacheLoader API
クラス名 | 説明 |
---|---|
|
JCacheキャッシュ・ローダー。 |
|
JCacheキャッシュ・ストア。 |
|
Coherence ロードとストアの完全な実装には、 |
|
Coherence 注意: 永続性ユニットは、 |
Coherence JPAを使用してデータベースにオブジェクトをロードおよび格納する手順は次のとおりです。
JPAプロバイダ実装の入手。プロバイダ実装により、Javaオブジェクトをデータベースにマップ、問合せ、および格納できます。
Coherence JPAキャッシュ・ストアの構成。JPAキャッシュ・ストア構成により、データベース・エンティティとJavaオブジェクトをマップします。
JPAプロバイダにより、SQL文を使用するのではなく、直接Javaオブジェクトを操作できます。また、データをマップ、格納、更新および取得することができます。データベース・エンティティとJavaオブジェクト間の変換は、プロバイダが実行します。
JPAプロバイダは、Coherenceディストリビューションに付属していませんが、入手できます。Coherence JPAキャッシュ・ストアは、任意のJPA準拠の実装で機能しますが、EclipseLink JPAの使用をお薦めします。EclipseLink JPAは、JPA 2.0仕様のリファレンス実装です。EclipseLink JPAは、Eclipseの次のURLから入手できます。
http://www.eclipse.org/eclipselink
Oracle TopLinkおよびCoherence統合用TopLink Gridには、JPA実装としてEclipseLinkが組み込まれています。TopLinkとダウンロードの詳細は、次のURLを参照してください。
http://www.oracle.com/technology/products/ias/toplink/index.html
JPAは、データベースへのJavaオブジェクトのマッピング、問合せ、格納に使用される標準APIです。ただし、キャッシング、スレッド処理、および全体的なパフォーマンスについては、JPA実装ごとに特性が異なる場合があります。TopLinkは、数多くの高度な機能を備え、パフォーマンスに優れたJPA実装を提供します。
Coherenceは、デフォルトのエンティティベースのキャッシュ・ストア実装であるJpaCacheStore
と、対応するキャッシュ・ローダー実装であるJpaCacheLoader
を提供します。その他の情報については、これらのクラスのJavadocを参照してください。
Coherence JpaCacheStore
を構成する手順は次のとおりです。
データベースにエンティティ・クラスをマップします。 これにより、JPAキャッシュ・ストアを介してオブジェクトをロードおよび格納できます。JPAマッピングは標準仕様に準拠しているため、すべてのJPAプロバイダに対して同じ方法で指定できます。
エンティティは、エンティティ・クラスに注釈を付けるか、orm.xml
または他のXMLマッピング・ファイルを追加することでマップできます。JPAエンティティのマップ方法の詳細は、JPAプロバイダのドキュメントを参照してください。
JPA構成を作成するには、persistence.xml
ファイルを編集します。このファイルには、ランタイムの動作を指示するプロパティがあります。
RESOURCE_LOCAL
にトランザクション・タイプを設定し、JPAプロバイダに必要なJDBCプロパティ(driver
、url
、user
、password
など)には、データベースへの接続およびログインに適した値を指定します。JPA注釈を使用してマップされるクラスは、<class>
要素に記述してください。例1-1は、設定可能な一般的なプロパティを含むpersistence.xml
ファイルの例を示しています。
例1-1 JPAのpersistence.xmlファイルのサンプル
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance" version="1.0" xmlns="http://java.sun.com/xml/ns/persistence"><persistence-unit name="EmpUnit" transaction-type="RESOURCE_LOCAL">
<provider> org.eclipse.persistence.jpa.PersistenceProvider </provider> <class>com.oracle.coherence.handson.Employee</class> <properties><property name="eclipselink.jdbc.driver" value="oracle.jdbc.OracleDriver"/>
<property name="eclipselink.jdbc.url" value="jdbc:oracle:thin:@localhost:1521:XE"/>
<property name="eclipselink.jdbc.user" value="scott"/>
<property name="eclipselink.jdbc.password" value="tiger"/>
</properties> </persistence-unit> </persistence>
coherence-cache-config.xml
ファイルを作成して、デフォルトのCoherence設定をオーバーライドし、JpaCacheStore
キャッシング・スキームを定義します。キャッシング・スキームには、JpaCacheStore
クラスをリストし、次のパラメータを含む<cachestore-scheme>
要素が必要です。
格納するエンティティのエンティティ名。JPAで明示的にオーバーライドされていないかぎり、エンティティ・クラスの非修飾名になります。例1-2では、組込みのCoherenceマクロ {cache-name}
を使用して、キャッシュ・ストアを構成および使用するキャッシュの名前に変換します。永続エンティティの種類ごとに別個のキャッシュを使用した後、各キャッシュの名前が、その中に格納されるエンティティの名前に従って設定されるため、この操作は正常に処理されます。
エンティティ・クラスの完全修飾名。すべてのクラスが同一パッケージ内にあり、デフォルトのJPAエンティティ名を使用する場合は、ここでも{cache-name}
マクロを使用して、エンティティの種類ごとに異なる部分に入力できます。このようにすることで、同じ永続性ユニット内でキャッシュされるすべてのエンティティで、同じキャッシング・スキームを使用できます。
これにより、様々な名前付きのキャッシュに対して、JPAキャッシング・スキームの使用が指示されます。例1-2は、Employee
という名前のNamedCache
クラスを定義するcoherence-cache-config.xml
ファイルのサンプルを示しています。これによって、Employee
クラスのインスタンスがキャッシュされます。追加クラス用のエンティティ・キャッシュを定義するには、さらに<cache-mapping>
要素をこのファイルに追加します。
例1-2 JPAキャッシング・スキームに対する名前付きキャッシュの割当て
<cache-config> <caching-scheme-mapping> <cache-mapping> <!-- Set the name of the cache to be the entity name. --> <cache-name>Employee</cache-name> <!-- Configure this cache to use the following defined scheme. --> <scheme-name>jpa-distributed</scheme-name> </cache-mapping> </caching-scheme-mapping> <caching-schemes> <distributed-scheme> <scheme-name>jpa-distributed</scheme-name> <service-name>JpaDistributedCache</service-name> <backing-map-scheme> <read-write-backing-map-scheme> <internal-cache-scheme> <local-scheme/> </internal-cache-scheme> <!- Define the cache scheme. --> <cachestore-scheme> <class-scheme> <class-name> com.tangosol.coherence.jpa.JpaCacheStore </class-name> <init-params> <!-- This param is the entity name. --> <init-param> <param-type>java.lang.String</param-type> <param-value>{cache-name}</param-value> </init-param> <!-- This param is the fully qualified entity class. --> <init-param> <param-type>java.lang.String</param-type> <param-value>com.acme.{cache-name}</param-value> </init-param> <!-- This param should match the value of the --> <!-- persistence unit name in persistence.xml. --> <init-param> <param-type>java.lang.String</param-type> <param-value>EmpUnit</param-value> </init-param> </init-params> </class-scheme> </cachestore-scheme> </read-write-backing-map-scheme> </backing-map-scheme> </distributed-scheme> </caching-schemes> </cache-config>
JpaCacheStore
クラスを使用する場合場合、挿入または更新の際にエンティティが確実に変更されないようにするには、永続性ユニットを構成します。JPAプロバイダによるエンティティへの変更は、いずれもCoherenceキャッシュには反映されません。これは、キャッシュ内のエンティティがデータベースの内容と一致しなくなることを意味します。特に、エンティティがIDを取得する際に、ID生成(@GeneratedValue
など)が使用されないようにします。IDは、オブジェクトがCoherenceに格納される前にアプリケーション・コードで割り当てる必要があります。通常、IDはCoherenceに格納されるエンティティが属するキーになります。
オプティミスティック・ロック(@Version
など)は、データベース・トランザクションのコミットに失敗する可能性があるため使用しないでください。キャッシュ・ストアの使用方法およびデータベース・スキーマの設定方法の詳細は、『Oracle Coherenceスタート・ガイド』のリードスルー、ライトスルー、ライトビハインドおよびリフレッシュアヘッド・キャッシュに関する項および『Oracle Coherence開発者ガイド』のCacheStoreのサンプルに関する項を参照してください。
JpaCacheStore
クラスまたはJpaCacheLoader
クラスを使用する場合、永続性ユニットのL2 (共有)キャッシュを無効にする必要があります。ご使用のプロバイダのドキュメントを参照してください。Oracle TopLinkでは、個別のエンティティに@Cache(shared=false)
と指定するか、デフォルトとしてpersistence.xml
ファイルの次のプロパティに指定できます。
<property name="eclipselink.cache.shared.default" value="false"/>
EclipseLinkをTopLink Gridで使用する場合、TopLink Grid実装によってL2キャッシュ、オプティミスティック・ロック・チェックおよびバージョニングが自動的に無効になります。基本的に、TopLink Grid実装では、永続性ユニットがデプロイされるキャッシュ・ストア・コンテキストが認識され、適宜、構成が調整されます。
図1-1は、クライアント・アプリケーション(Coherence APIを採用している)、Coherenceキャッシュ、TopLink Gridおよびデータベース間の関係を示しています。
TopLink Gridのキャッシュ・ストア実装およびキャッシュ・ローダー実装は、toplink-grid.jar
ファイルに含まれています。TopLink Gridは、標準のJPAランタイム構成ファイルpersistence.xml
とJPAマッピング・ファイルorm.xml
を使用します。Coherenceのキャッシュ構成ファイルcoherence-cache-config.xml
を指定して、デフォルトのCoherence設定をオーバーライドし、キャッシュ・ストア・キャッシング・スキームを定義する必要があります。
TopLink Gridのキャッシュ・ストア・クラスとキャッシュ・ローダー・クラスは、EclipseLink JPAにあわせて最適化され、Coherenceアプリケーションで使用できるように設計されています。これらのクラスは、oracle.eclispelink.coherence.standalone
パッケージ内にあります。表1-2では、これらのクラスについて説明します。
キャッシュ構成(coherence-cache-config.xml
)では、例1-3に示すようにキャッシュを定義します。TopLink Gridで必要な操作は、次の2つのパラメータを定義することのみです。
格納するエンティティのキャッシュの名前。JPAで明示的にオーバーライドされないかぎり、エンティティ・クラスの非修飾名がデフォルトでエンティティ名になります。例1-3では、キャッシュの名前はEmployee
です。組込みのCoherenceマクロ{cache-name}
を利用すると、キャッシュ・ストアを構成および使用するキャッシュの名前を入力できます。
格納するエンティティを含む永続性ユニットの名前。例1-3では、employee-pu
はEmployee
エンティティを含むMETA-INF/persistence.xml
で定義された永続性ユニットです。
追加のエンティティ・キャッシュを定義するには、<cache-mapping>
要素をさらに追加します。
例1-3 TopLink Gridを使用したCoherenceのキャッシュの構成
<cache-config> <caching-scheme-mapping> <cache-mapping> <cache-name>Employee</cache-name> <scheme-name>distributed-eclipselink</scheme-name> </caching-scheme-mapping> </caching-scheme-mapping> <caching-schemes> <distributed-scheme> <scheme-name>distributed-eclipselink</scheme-name> <service-name>EclipseLinkJPA</service-name> <backing-map-scheme> <read-write-backing-map-scheme> <internal-cache-scheme> <local-scheme /> </internal-cache-scheme> <!-- Define the cache scheme. --> <cachestore-scheme> <class-scheme> <!-- Because the client code is using Coherence API, use the "standalone" version of the cache loader. --> <class-name>oracle.eclipselink.coherence.standalone.EclipseLinkJPACacheStore</class-name> <init-params> <!-- This parameter is the name of the cache containing the entity. --> <init-param> <param-type>java.lang.String</param-type> <param-value>{cache-name}</param-value> </init-param> <!-- This parameter is the persistence unit name. --> <init-param> <param-type>java.lang.String</param-type> <param-value>employee-pu</param-value> </init-param> </init-params> </class-scheme> </cachestore-scheme> </read-write-backing-map-scheme> </backing-map-scheme> <autostart>true</autostart> </distributed-scheme> </caching-schemes></cache-config>
注意: この項では、TopLink GridのキャッシュとしてCoherenceを使用する方法のみを説明しています。詳細は、CoherenceグリッドでのOracle TopLinkの統合ガイドを参照してください。 |
Oracle TopLink Gridは、EclipseLink JPAとCoherenceとの統合を可能にするOracle TopLinkの機能です。標準のJPAアプリケーションは、プライマリ・データ・ストア(一般的にリレーショナル・データベース)と直接対話します。ただし、TopLink Gridの場合、ドメイン・モデルの一部またはすべてをCoherenceデータ・グリッドに格納できます。この構成は、「グリッド基盤のJPA」とも呼ばれています。
TopLink Gridを簡単に構成して、Coherenceのプライマリ・データ・ストアとしての使用、グリッドに対する問合せの実行、およびCoherenceによる新規データと変更データにおける永続性の管理ができます。Coherenceでは、JPAとデータ・ストア間のレイヤーが提供されており、すべてのアプリケーション・インスタンスからデータベース・コールを直接オフロードできます。これにより、クラスタ化されたアプリケーションのデプロイメントでは、通常のデータベース操作の限界を超えるスケーラビリティが得られます
アプリケーションで使用できる一般的なTopLink Gridの構成は次のとおりです。
グリッド・キャッシュ構成。CoherenceをTopLink L2 (共有)キャッシュとして使用します。この構成では、Coherenceのキャッシュにすべて事前ロードできずデータベースでホストされるデータに依存するJPAアプリケーションにCoherenceのデータ・グリッドを適用します。事前ロードができない理由には、Coherenceのフィルタの機能セットを超える非常に複雑な問合せ、古いキャッシュの原因となるサード・パーティ製データベースによる更新、ネイティブSQL問合せ、ストアド・プロシージャやトリガーへの依存などがあります。
この構成では、ローカルL2キャッシュを調整することなく、TopLinkを大規模なクラスタにスケール・アップできます。エンティティに対する更新は、トランザクションがコミットされると即時にすべてのCoherenceクラスタ・メンバーで使用可能になります。
グリッド読取り構成。この構成は、(比較的安定した)大容量データへ高速にアクセスして変更をデータベースへ同期的に書き込む必要のあるエンティティに最適です。これらのエンティティでは、Coherenceキャッシュへの移入にキャッシュ・ウォーミングが使用されますが、各問合せは必要に応じてデータベースに送信することもできます。
グリッド・エンティティ構成。この構成は、(比較的安定した)大容量データへ高速にアクセスする必要があり、更新が比較的少ないアプリケーションに最適です。ライトビハインドを使用してこの構成をCoherenceキャッシュ・ストアと組み合せると、データベース更新を非同期に実行することにより、アプリケーションのレスポンス時間を向上させることができます。
TopLink Grid用Coherenceの構成の詳細は、Oracle Technology NetworkのOracle TopLink Gridのページを参照してください。
http://www.oracle.com/technetwork/middleware/ias/tl-grid-097210.html