Java Persistence API(JPA)は、オブジェクト・リレーショナル・マッピング(ORM)およびエンタープライズJava Persistenceにおける標準です。この章で説明する内容は次のとおりです。
CoherenceでデフォルトのエンティティベースのCacheStore実装およびCacheLoader実装を使用する方法。これらの実装では、JPAを使用してオブジェクトをデータベースにロードおよび格納します。
TopLink GridでバッキングしたキャッシュでCoherence APIを使用して、EclipseLink JPAにあわせて最適化されたJPA CacheLoader実装とCacheStore実装に関連するデータにアクセスする方法。
|
注意: 現時点では、リソース・ローカルおよびブートストラップのエンティティ・マネージャのみがサポートされています。コンテナ管理のエンティティ・マネージャ、およびJTAトランザクションを使用するマネージャは、サポート対象ではありません。 |
この章では、グリッド上のJPAについても簡単に説明します。このシナリオでは、JPAアプリケーションではTopLink Gridを使用してデータベースと直接対話します。それに対して、TopLink GridではCoherenceデータ・グリッドを使用してドメイン・モデルの一部またはすべてを格納します。グリッド上のJPAに関する詳細は、このドキュメントでは取り上げません。このトピックの詳細は、CoherenceグリッドでのOracle TopLinkの統合ガイドを参照してください。
この章の内容は次のとおりです。
Coherence JPAを使用してデータベースにオブジェクトをロードおよび格納する一般的な手順は、次のとおりです。
Oracle Coherenceでは、CacheLoaderクラスとCacheStoreクラスの独自実装が提供されています。JpaCacheLoaderクラスとJpaCacheStoreクラスは任意の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
| クラス名 | 説明 |
|---|---|
|
com.tangosol.net.cache.CacheLoader |
JCacheキャッシュ・ローダー |
|
com.tangosol.net.cache.CacheStore |
JCacheキャッシュ・ストア: |
|
com.tangosol.coherence.jpa.JpaCacheLoader |
ロードとストアの完全な実装には、 |
|
com.tangosol.coherence.jpa.JpaCacheStore |
注意: 永続性ユニットは、 |
JPAプロバイダはCoherenceに付属していませんが、容易に入手できます。JPA CacheStoreは、任意のJPA準拠の実装で機能しますが、EclipseLink JPAを使用することをお薦めします。EclipseLink JPAは、JPA 2.0仕様のリファレンス実装です。オラクル社は、Eclipse JPAをはじめとする、オープンソースのEclipseLinkプロジェクトをリードしています。EclipseLinkは、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には、デフォルトのエンティティベースのCacheStore実装として、JpaCacheStore(および対応するCacheLoader実装であるJpaCacheLoader)が組み込まれています。その他の情報については、実装するクラスのJavadocを参照してください。
Coherence JpaCacheStoreを構成する一般的手順は次のとおりです。
CacheStoreでオブジェクトをロードおよび格納するには、データベースにクラスがマップされているかどうかを確認します。JPAマッピングは標準仕様に準拠しているため、すべてのJPAプロバイダに対して同じ方法で指定できます。
エンティティは、エンティティ・クラスに注釈を付けるか、orm.xmlまたは他のXMLマッピング・ファイルを追加してマップされます。JPAエンティティのマップ方法の詳細は、JPAプロバイダのドキュメントを参照してください。
一般的なJPA構成では、persistence.xmlファイルを編集する必要があります。このファイルには、ランタイムの動作を指示するプロパティがあります。
例1-1のサンプルpersistence.xmlファイルは、設定できる一般的プロパティを示しています。トランザクション・タイプはRESOURCE_LOCALに設定され、JPAプロバイダに必要なJDBCプロパティ(driver、url、user、passwordなど)には、使用するデータベースの接続およびログイン用の値が格納されます。JPA注釈を使用してマップされるクラスは、<class>要素に記述してください。
例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}を利用して、CacheStoreを構成および使用するキャッシュの名前に変換します。永続エンティティの種類ごとに別個のキャッシュを使用した後、各キャッシュの名前がその中に格納されるエンティティの名前に従って設定されるため、この操作は正常に処理されます。
エンティティ・クラスの完全修飾名。クラスのすべてが同一パッケージ内にあり、デフォルトの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 scheme defined below -->
<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>
com.tangosol.coherence.jpa.JpaCacheStoreを使用する場合、挿入または更新の際にエンティティが確実に変更されないようにするには、永続性ユニットを構成します。JPAプロバイダによるエンティティへの変更は、いずれもCoherenceキャッシュには反映されません。これは、キャッシュ内のエンティティがデータベースの内容と一致しなくなることを意味します。特に@GeneratedValueなど、エンティティがIDの取得にID生成を使用しない場合、オブジェクトがCoherenceに置かれる前にアプリケーション・コードでIDを割り当てる必要があります。通常、IDはCoherenceに格納されるエンティティが属するキーになります。
オプティミスティック・ロック(@Versionなど)は、データベース・トランザクションのコミットに失敗する可能性があるため使用しないでください。CacheStoreの使用方法およびデータベース・スキーマの設定方法の詳細は、『Oracle Coherenceスタート・ガイド』の「リードスルー、ライトスルー、ライトビハインドおよびリフレッシュアヘッド・キャッシュ」および『Oracle Coherence開発者ガイド』の「CacheStoreのサンプル」を参照してください。
JpaCacheStoreまたはJpaCacheLoaderを使用する場合、永続性ユニットのL2(共有)キャッシュを無効にする必要があります。プロバイダについてはドキュメントを参照してください。TopLinkでは、各エンティティに@Cache(shared=false)と指定するか、デフォルトとしてpersistence.xmlの次のプロパティに指定できます。
<property name="eclipselink.cache.shared.default" value="false"/>
EclipseLinkをTopLink Gridで使用する場合、TopLink Grid実装ではL2キャッシュ、オプティミスティック・ロック・チェックおよびバージョニングが自動的に無効になります。基本的にTopLink Grid実装では、CacheStoreコンテキストに永続性ユニットがデプロイされて適宜構成が調整されることが認識されます。
図1-1は、クライアント・アプリケーション(Coherence APIを採用している)、Coherenceキャッシュ、TopLink Gridおよびデータベースとの間の関係を示しています。
TopLink GridのCacheStore実装およびCacheLoader実装は、toplink-grid.jarに含まれています。TopLink Gridには、標準のJPAランタイム構成ファイルpersistence.xmlおよびJPAマッピング・ファイルorm.xmlを使用します。Coherenceキャッシュ構成ファイルのcoherence-cache-config.xmlを指定して、デフォルトのCoherence設定をオーバーライドし、CacheStoreキャッシング・スキームを定義する必要があります。
TopLink Grid CacheStoreクラスとCacheLoaderクラスはEclipseLink JPAにあわせて最適化され、Coherenceアプリケーションで使用できるように設計されています。これらのクラスは、oracle.eclispelink.coherence.standaloneパッケージ内にあります。表1-2では、これらのクラスについて説明します。
キャッシュ構成(coherence-cache-config.xml)では、例1-3で示されているようにキャッシュを定義します。TopLink Gridで必要な操作は、次の2つのパラメータを定義することのみです。
格納するエンティティのキャッシュの名前。JPAで明示的にオーバーライドされないかぎり、エンティティ・クラスの非修飾名がデフォルトでエンティティ名になります。この例では、キャッシュの名前はEmployeeです。組込みのCoherenceマクロ{cache-name}を利用すると、CacheStoreを構成および使用するキャッシュの名前を入力できます。
格納するエンティティを含む永続性ユニットの名前。この例では、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>
<!--
Since the client code is using Coherence API we need 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の構成には次の3つがあります。
Coherenceによる共有L2キャッシュ構成: この構成では、CoherenceをTopLink L2(共有)キャッシュとして使用します。また、この構成では、Coherenceのキャッシュにすべて事前ロードできずデータベースでホストされるデータに依存するJPAアプリケーションにCoherenceのデータ・グリッドを適用できます。事前ロードができない理由には、Coherenceのフィルタの機能セットを超える非常に複雑な問合せ、古いキャッシュの原因となるサード・パーティ製データベースによる更新、ネイティブSQL問合せ、ストアド・プロシージャやトリガーへの依存などがあります。
この構成では、ローカルL2キャッシュを調整することなく、TopLinkを大規模なクラスタにスケール・アップできます。エンティティに対する更新は、トランザクションがコミットされるとただちに、すべてのCoherenceクラスタ・メンバーにおいて使用できます。
Coherenceの読取り: この構成は、(比較的安定した)大容量データへ高速にアクセスして変更をデータベースへ同期的に書き込む必要のあるエンティティに適しています。これらのエンティティでは、Coherenceキャッシュへの移入にキャッシュ・ウォーミングが使用されますが、各問合せは必要に応じてデータベースへ送信されます。
Coherenceの読取り/書込み: この構成は、(比較的安定した)大容量データへ高速にアクセスする必要があり更新が比較的少ないアプリケーションに適しています。この構成は、ライトビハインドを使用しCoherence CacheStoreと組み合せることができます。これにより、データベースの更新が非同期に行われ、アプリケーションのレスポンス時間が向上します。
TopLink Grid用Coherenceの構成の詳細は、Oracle Technology NetworkのOracle TopLink Gridページを参照してください。