ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Coherenceの統合
12c (12.1.3)
E56207-01
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

2 Coherence APIを使用したJPAの統合

この章では、Coherence APIをTopLink Gridによって支援されたキャッシュとともに使用して、リレーショナル・データにアクセスする方法について説明します。また、Coherence固有のエンティティベースのキャッシュ・ストア実装およびキャッシュ・ローダー実装を使用してリレーショナル・データにアクセスする方法についても説明します。これらの実装では、JPAを使用してデータベースにオブジェクトをロードおよび格納します。


注意:

Coherence APIおよびJPAでは、リソース・ローカルおよびブートストラップのエンティティ・マネージャのみを使用できます。コンテナ管理のエンティティ・マネージャ、およびJava Transaction Architecture (JTA)トランザクションを使用するマネージャは、現在サポートされていません。


この章では、次の内容を説明します。

2.1 TopLink GridとCoherenceクライアント・アプリケーションの使用

この項では、Coherence APIをTopLink Gridによって支援されたキャッシュとともに使用して、リレーショナル・データにアクセスする方法について説明します。リレーショナル・データへのアクセスには、JPAキャッシュ・ローダーおよびEclipseLink JPA用に最適化されたキャッシュ・ストア・インタフェースが用意されています。

この従来のCoherenceアプローチでは、TopLink GridはEclipseLink JPA用に最適化されたoracle.eclipselink.coherence.standaloneパッケージにCacheLoaderおよびCacheStore実装を提供します。

図2-1は、クライアント・アプリケーション(Coherence APIを採用している)、Coherenceキャッシュ、TopLink Gridおよびデータベース間の関係を示しています。

図2-1 TopLink GridでのCoherenceのアプローチ

従来のCoherenceのアプローチ。
「図2-1 TopLink GridでのCoherenceのアプローチ」の説明

2.1.1 TopLink Gridを使用したCoherence構成のAPI

TopLink Gridは、標準のJPAランタイム構成ファイルpersistence.xmlとJPAマッピング・ファイルorm.xmlを使用します。Coherenceのキャッシュ構成ファイルcoherence-cache-config.xmlを、デフォルトのCoherence設定をオーバーライドし、キャッシュ・ストア・キャッシング・スキームを定義するように指定する必要があります。

TopLink Gridのキャッシュ・ストア実装およびキャッシュ・ローダー実装は、toplink-grid.jarファイルに含まれています。Coherence製品に付属のJARファイルは...\oracle_common\modules\oracle.toplink_12.1.3フォルダにインストールされます。

TopLink Gridのキャッシュ・ストア・クラスとキャッシュ・ローダー・クラスは、EclipseLink JPAにあわせて最適化され、Coherenceアプリケーションで使用できるように設計されています。これらのクラスは、oracle.eclispelink.coherence.standaloneパッケージ内にあります。表2-1では、これらのクラスについて説明します。

表2-1 TopLink Gridを使用したCoherenceアプリケーションを構築するためのTopLink Gridクラス

クラス名 説明

EclipseLinkJPACacheLoader

JPA対応バージョンのCoherence CacheLoaderクラスを提供します。

EclipseLinkJPACacheStore

JPA対応バージョンのCoherence CacheStoreクラスを提供します。


2.1.2 TopLink Gridを使用するCoherenceのサンプル・キャッシュ構成ファイル

キャッシュ構成ファイル(coherence-cache-config.xml)では、例2-1に示すようにキャッシュを定義します。TopLink Gridで必要な操作は、次の2つのパラメータを定義することのみです。

  • 格納するエンティティのキャッシュの名前。JPAで明示的にオーバーライドされないかぎり、エンティティ・クラスの非修飾名がデフォルトでエンティティ名になります。例2-1では、キャッシュの名前はEmployeeです。組込みのCoherenceマクロ{cache-name}を利用すると、キャッシュ・ストアを構成および使用するキャッシュの名前を入力できます。

  • 格納するエンティティを含む永続性ユニットの名前例2-1では、employee-puEmployeeエンティティを含むMETA-INF/persistence.xmlで定義された永続性ユニットです。

    追加のエンティティ・キャッシュを定義するには、<cache-mapping>要素をさらに追加します。

例2-1 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>

2.1.3 CoherenceをTopLink Gridとともに使用するサンプル・プロジェクト

『Oracle Fusion Middleware Oracle Coherenceチュートリアル』のJPAとCoherenceの併用に関する項には、EclipseLink JPAにあわせて最適化され、Coherenceアプリケーションで使用できるように設計されたTopLink Gridのキャッシュ・ストア・クラスとキャッシュ・ローダー・クラスを使用するサンプル・プロジェクトがあります。これらのクラスはoracle.eclispelink.coherence.standaloneパッケージにあります。

プロジェクトではOracle Express DatabaseおよびEclipse IDEを使用して、JPA用のプロジェクトの構成、JPA永続性ユニットとエンティティの作成、persistence.xmlファイルの編集、JPA用のキャッシュ構成ファイルの作成、データベース表に対するJPAオプジェクトの自動生成、およびデータ・オブジェクトと相互作用するクラスの作成を実行します。

2.2 サード・パーティJPAプロバイダの使用

Oracle Coherenceでは、JPAで使用できるCacheLoaderクラスとCacheStoreクラスの独自実装が提供されています。JpaCacheLoaderクラスとJpaCacheStoreクラスはEclipseLink JPAを使用する必要がなく、任意のJPA実装を使用してエンティティをデータ・ストアに対してロードおよび格納できます。このエンティティはデータ・ストアにマップされている必要があり、JPA永続性ユニット構成が存在する必要があります。JPA永続性ユニットは、永続化可能なユーザー定義のエンティティ・クラスとそれらの設定からなる論理グループとして定義されます。

Coherenceでは、coherence-cache-config.xmlというデフォルトのキャッシュ構成ファイルも提供されています。JPAランタイム構成ファイルpersistence.xmlと、デフォルトのJPAオブジェクト・リレーショナル・マッピング・ファイルorm.xmlは通常、JPA実装で提供されます。

2.2.1 Coherence固有のJPA CacheStoreおよびCacheLoader用API

JpaCacheLoaderおよびJpaCacheStoreクラスはcoherence-jpa.jarファイルにあり、このファイルはCoherenceのインストールで...\coherence\libフォルダにインストールされます。CacheLoaderおよびCacheStoreインタフェースはcoherence.jarファイルにあり、このファイルも...\coherence\libフォルダにインストールされます。

表2-2は、Coherenceで提供されるデフォルトのJPA実装を示しています。

表2-2 Coherenceに付属するJPA関連のCacheStoreとCacheLoader API

クラス名 説明

com.tangosol.net.cache.CacheLoader

JCacheキャッシュ・ローダー。

com.tangosol.net.cache.CacheStore

JCacheキャッシュ・ストア。CacheStoreインタフェースは、CacheLoaderを拡張します。

com.tangosol.coherence.jpa.JpaCacheLoader

Coherence CacheLoaderインタフェースのJPA実装。このクラスをロード専用の実装として使用します。これは、任意のJPA実装を使用してデータ・ストアからエンティティをロードできます。このエンティティはデータ・ストアにマップされている必要があり、JPA永続性ユニット構成が存在する必要があります。

ロードとストアの完全な実装には、JpaCacheStoreクラスを使用します。

com.tangosol.coherence.jpa.JpaCacheStore

Coherence CacheStoreインタフェースのJPA実装。このクラスをロードとストアの完全な実装として使用します。これは、任意のJPA実装を使用して、データ・ストアとの間でエンティティをロードおよび格納できます。このエンティティはデータ・ストアにマップされている必要があり、JPA永続性ユニット構成が存在する必要があります。

注意: 永続性ユニットは、RESOURCE_LOCALトランザクションを使用するように設定されていることが前提になります。


2.2.2 サード・パーティJPAプロバイダおよびCoherence固有のJPA用APIを使用するための手順

サード・パーティJPAプロバイダおよびCoherence固有のJPA APIを使用して、データベースにオブジェクトをロードおよび格納する手順は次のとおりです。

  1. JPAプロバイダ実装の入手。プロバイダ実装により、Javaオブジェクトをデータベースにマップ、問合せ、および格納できます。

  2. Coherence JPAキャッシュ・ストアの構成。JPAキャッシュ・ストア構成により、データベース・エンティティとJavaオブジェクトをマップします。

2.2.2.1 JPAプロバイダ実装の入手

JPAプロバイダにより、SQL文を使用するのではなく、直接Javaオブジェクトを操作できます。また、データをマップ、格納、更新および取得することができます。データベース・エンティティとJavaオブジェクト間の変換は、プロバイダが実行します。

Coherence JPAキャッシュ・ストアおよびキャッシュ・ローダーは、JPA準拠の実装を使用します。JPA 2.0仕様のリファレンス実装であるEclipseLink JPAを使用することをお薦めします。Oracle TopLinkおよびCoherence統合用TopLink Gridには、JPA実装としてEclipseLinkが組み込まれています。

TopLink GridおよびEclipseLinkのJARファイル(toplink-grid.jarおよびeclipselink.jar)はCoherenceインストールに含まれており、...\oracle_common\modules\oracle.toplink_12.1.3フォルダに配置されます。

2.2.2.2 Coherence JPAキャッシュ・ストアの構成

JPAは、データベースへのJavaオブジェクトのマッピング、問合せ、格納に使用される標準APIです。ただし、キャッシング、スレッド処理、および全体的なパフォーマンスについては、JPA実装ごとに特性が異なる場合があります。EclipseLinkは、数多くの高度な機能を備え、パフォーマンスに優れたJPA実装を提供します。

Coherenceは、デフォルトのエンティティベースのキャッシュ・ストア実装であるJpaCacheStoreと、対応するキャッシュ・ローダー実装であるJpaCacheLoaderを提供します。その他の情報については、これらのクラスのJavadocを参照してください。

Coherence JpaCacheStoreを構成する手順は次のとおりです。

  1. 永続クラスのマッピング

  2. JPAの構成

  3. JPA用のCoherenceキャッシュの構成

  4. 永続性ユニットの構成

2.2.2.2.1 永続クラスのマッピング

データベースにエンティティ・クラスをマップします。これにより、JPAキャッシュ・ストアを介してオブジェクトをロードおよび格納できます。JPAマッピングは標準仕様に準拠しているため、すべてのJPAプロバイダに対して同じ方法で指定できます。

エンティティは、エンティティ・クラスに注釈を付けるか、orm.xmlまたは他のXMLマッピング・ファイルを追加することでマップできます。JPAエンティティのマップ方法の詳細は、JPAプロバイダのドキュメントを参照してください。

2.2.2.2.2 JPAの構成

JPA構成を作成するには、persistence.xmlファイルを編集します。このファイルには、ランタイムの動作を指示するプロパティがあります。

RESOURCE_LOCALにトランザクション・タイプを設定し、JPAプロバイダに必要なJDBCプロパティ(driverurluserpasswordなど)には、データベースへの接続およびログインに適した値を指定します。JPA注釈を使用してマップされるクラスは、<class>要素に記述してください。例2-2は、設定可能な一般的なプロパティを含むpersistence.xmlファイルの例を示しています。

例2-2 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>
2.2.2.2.3 JPA用のCoherenceキャッシュの構成

coherence-cache-config.xmlファイルを作成して、デフォルトのCoherence設定をオーバーライドし、JpaCacheStoreキャッシング・スキームを定義します。キャッシング・スキームには、JpaCacheStoreクラスをリストし、次のパラメータを含む<cachestore-scheme>要素が必要です。

  • 格納するエンティティのエンティティ名。JPAで明示的にオーバーライドされていないかぎり、エンティティ・クラスの非修飾名になります。例2-3では、組込みのCoherenceマクロ{cache-name}を使用して、キャッシュ・ストアを構成および使用するキャッシュの名前に変換します。永続エンティティの種類ごとに別個のキャッシュを使用した後、各キャッシュの名前が、その中に格納されるエンティティの名前に従って設定されるため、この操作は正常に処理されます。

  • エンティティ・クラスの完全修飾名。すべてのクラスが同一パッケージ内にあり、デフォルトのJPAエンティティ名を使用する場合は、ここでも{cache-name}マクロを使用して、エンティティの種類ごとに異なる部分に入力できます。このようにすることで、同じ永続性ユニット内でキャッシュされるすべてのエンティティで、同じキャッシング・スキームを使用できます。

  • 永続性ユニット名。これは、persistence.xmlファイルで指定した名前と同じにする必要があります。

これにより、様々な名前付きのキャッシュに対して、JPAキャッシング・スキームの使用が指示されます。例2-3は、Employeeという名前のNamedCacheクラスを定義するcoherence-cache-config.xmlファイルのサンプルを示しています。これによって、Employeeクラスのインスタンスがキャッシュされます。追加クラス用のエンティティ・キャッシュを定義するには、さらに<cache-mapping>要素をこのファイルに追加します。

例2-3 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>
2.2.2.2.4 永続性ユニットの構成

JpaCacheStoreクラスを使用する場合、挿入または更新の際にエンティティが確実に変更されないようにするには、永続性ユニットを構成します。JPAプロバイダによるエンティティへの変更は、いずれもCoherenceキャッシュには反映されません。これは、キャッシュ内のエンティティがデータベースの内容と一致しなくなることを意味します。特に、エンティティがIDを取得する際に、ID生成(@GeneratedValueなど)が使用されないようにします。IDは、オブジェクトがCoherenceに格納される前にアプリケーション・コードで割り当てる必要があります。通常、IDはCoherenceに格納されるエンティティが属するキーになります。

オプティミスティック・ロック(@Versionなど)は、データベース・トランザクションのコミットに失敗する可能性があるため使用しないでください。キャッシュ・ストアの動作およびデータベース・スキーマのセットアップ方法の詳細は、『Oracle Fusion Middleware 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実装では、永続性ユニットがデプロイされるキャッシュ・ストア・コンテキストが認識され、適宜、構成が調整されます。