ヘッダーをスキップ
Oracle® Fusion Middleware Oracle TopLinkのためのCoherence Grid統合ガイド
11g リリース1(11.1.1)
B61395-01
  目次へ移動
目次

前
 
次
 

ラボおよび例

このラボでは、Oracle TopLink Grid機能を使用して、Oracle CoherenceとともにJava Persistence API(JPA)アプリケーションを有効にする方法を示します。TopLink GridとCoherenceは、次の2つの固有のアプリケーション・アーキテクチャを使用して結合できます。

このラボでは、TopLink Gridを使用して、グリッド基盤のJPAのアプリケーションを構築する方法を重点的に示します。このアプリケーションは、Coherenceの使用を介してJPAアプリケーションのスケールを調整する方法を提供するものです。

このドキュメントは次の項で構成されています。

ラボ環境の構成

このラボの要件(最小要件)は次のとおりです。

設定

ラボを実行する前に、必要なソフトウェアをインストールし、環境を構成する必要があります。

ラボのサンプルは次の場所からダウンロードできます。

http://www.oracle.com/technology/products/ias/toplink/doc/11110/grid/labs/toplinkgridlab.zip

ソフトウェア・インストール

次の手順を使用して、ラボに必要なソフトウェアをインストールします。

  1. Java 1.5以上のJDKまたはJREがマシンにまだインストールされていない場合は、ダウンロードしてインストールします。

  2. lab .ZIPファイルをダウンロードしてフォルダ(LAB_ROOTと表記)内に解凍します。ファイルを解凍すると、このフォルダ内に(toplinkおよびcoherenceを含む)複数のサブフォルダが作成されます。

  3. Oracle TopLink 11g リリース1(11.1.1)をダウンロードして、LAB_ROOT/toplink内に解凍します。

  4. Coherence 3.5をダウンロードして、LAB_ROOT内に解凍します。これは、LAB_ROOT/coherenceフォルダ内に抽出されます。


    注意:

    フォルダ構造が正しいこと、つまりLAB_ROOT/coherence/coherenceではなくLAB_ROOT/coherenceになっていることを確認します。

  5. Eclipse Galileo(3.5)ベースのOEPE 11g リリース1(11.1.1)をダウンロードし、任意のフォルダ(OEPE installと表記)内に解凍します。

  6. Oracle XEをダウンロードしてインストールします。ダウンロードに同梱されているインストール手順に従います。XEは任意のフォルダ(ORACLE_XE_ROOTと表記)にインストールできます。

  7. パスワードtigerを持つOracleデータベース・ユーザーscottを作成または有効化します。ユーザーscottに対してconnectおよびresource権限を付与します。

    ラボは、パスワードtigerを持つユーザー名scottに対して構成されています。別のユーザーを使用するには、このラボで使用するデータベース・ログインの値を変更する必要があります。

環境構成

次の手順を使用して、ラボ環境を構成します。

  1. OEPE installディレクトリからeclipse.exeを実行して、OEPEを開きます。

    ワークスペースを指定するように要求されます。Eclipseワークスペースが含まれるLAB_ROOTフォルダを選択します。

    図10 「Select Workspace Directory」ダイアログ

    「Select Workspace Directory」ダイアログです。
  2. TopLinkおよびCoherenceを適切なフォルダ内に解凍した場合は、「Problems」ビューにエラーが表示されずにワークスペースが開きます。

    エラーがある場合は、メニューから「Project」→「Clean」を選択し、「Clean all projects」を選択して、ラボの再コンパイルおよび再検証を行います。それでもエラーがなくならない場合は、TopLinkとCoherenceの両方を適切なフォルダ内に解凍したことを確認してください。

  3. メニューから「Window」→「Perspective」を選択して、JPAパースペクティブを開きます。

    図11 「Open Perspective」ダイアログ

    「Open Perspective」ダイアログで「JPA」を選択します。
  4. 「JPA Perspective」の「Data Source Explorer」ビューを使用して、必要に応じてOracle XE接続を変更します。Oracle XE接続では、デフォルトでscott/tiger @ localhostが使用されます。

    図12 Data Source Explorer

    接続を右クリックし、「Properties」を選択します。

    別のスキーマを使用するには、「Data Source Explorer」でOracle XE接続を右クリックし、「Properties」を選択します(図12)。「Driver Properties」セクションを選択し、接続を反映するよう値を編集します(図13)。


    注意:

    デフォルトを変更した場合は、ラボで使用するpersistence.xml構成ファイル内の接続値も編集する必要があります。

    図13 Driver Properties

    「Driver Properties」ダイアログです。

    図14 「Common」接続プロパティ

    OracleXE接続の「Common」接続プロパティです。

ラボの実行

3つのラボそれぞれに同じシンプル・ドメイン・モデル(図15)を使用します。これは、1つのEmployeeエンティティと、1つのAddressおよび一連のPhoneNumberで構成されます。

図15 ラボ・ドメイン・モデル

ラボのドメイン・モデルです。
「図15 ラボ・ドメイン・モデル」の説明

エンティティはすべて事前にマッピングされているため、JPAマッピングを気にすることなくTopLink Grid構成に集中することができます。

このドキュメントでは、次のラボについて説明します。

ラボ1: グリッド・キャッシュ構成

最も基本的な構成では、EclipseLinkとともにCoherenceを共有(L2)キャッシュとして使用します。EclipseLinkにはローカルの組込み共有オブジェクト・キャッシュが備わっているため、同時トランザクションや連続トランザクションは、他のトランザクションにより実行された読取りと更新を活用することができます。エンティティが更新され、データベース・コミットが正常に完了すると、更新が共有キャッシュに適用され、これらのトランザクションが変更を認識できるようになります。

ローカルな組込み共有オブジェクト・キャッシュをCoherenceに置き換えても、同じキャッシュ・セマンティクスが保持されます。アプリケーションはキャッシュ実装がローカル・キャッシュではなく分散キャッシュになったことを認識しないので、アプリケーションを変更する必要はありません。

Coherenceを共有キャッシュとして構成するには、次の作業を行います。

  • Coherenceを使用するようエンティティを構成します。

  • それらのエンティティに対してCoherenceキャッシュ構成を定義します。

ラボ1(図16を参照)は、Eclipseですぐに実行できるJPAプロジェクトとして用意されています。

図16 ラボ1プロジェクト

ラボ1プロジェクトの「Project Explorer」ビューです。

はじめに

「Employee」「Address」および「PhoneNumber」エンティティを開き、これらがどのようにマッピングされているかを確認します。

Coherenceを共有キャッシュとして構成する前に、次の手順を1回実行して、正しい環境になっていることを確認します。

  1. データベース接続がデフォルトとは異なる場合、META-INF/persistence.xmlファイル内の次のEclipseLink JDBCプロパティを更新する必要があります。

    • eclipselink.jdbc.driver

    • eclipselink.jdbc.url

    • eclipselink.jdbc.user

    • eclipselink.jdbc.password

  2. 「Project Explorer」ビューから「Lab 1-TopLink Grid Cache」プロジェクトを右クリックし、メニューから「JPA」→「Generate Tables from Entities…」を選択して、ラボで使用するデータベース表を削除してから作成します。存在しない表を削除できないことによるエラーは無視してかまいません。表を生成すると、データベースへのログインが行われます。


    注意:

    「Schema "null" cannot be resolved for table "<TABLE_NAME>"」というエラーが発生する場合は、既知のEclipseバグが原因です。この問題を解決するには、プロジェクトを右クリックし、メニューから「Validate」を選択します。Eclipseによってエラーがクリアされます。

  3. gridcache.example.InsertExampleを実行すると、Employee、AddressおよびPhoneNumberがデータベースに移入されます。ここに示されているcreateEmployee()メソッドは、エンティティを定義しています。

    public static Employee createEmployee() {
      Employee employee = new Employee();
      employee.setFirstName("Bob");
      employee.setLastName("Smith");
     
      Address address = new Address();
      address.setCity("Toronto");
      address.setPostalCode("L5J2B5");
      address.setProvince("ON");
      address.setStreet("1450 Acme Cr., Suite 4");
      address.setCountry("Canada");
      employee.setAddress(address);
      
      employee.addPhoneNumber("Work", "613", "5558812");
    
      return employee;
      }
    

    コンソール出力は次のようになります。

    [EL Fine]: Connection(876215)--UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ?
    [EL Fine]: Connection(876215)--
         bind => [50, SEQ_GEN]
    [EL Fine]: Connection(876215)--SELECT SEQ_COUNT FROM SEQUENCE WHERE SEQ_NAME = ?
        bind => [SEQ_GEN]
    [EL Fine]: Connection(876215)--INSERT INTO GRIDCACHE_ADDRESS (ID, POSTALCODE, STREET, PROVINCE, VERSION, COUNTRY, CITY) VALUES (?, ?, ?, ?, ?, ?, ?)
    [EL Fine]: Connection(876215)--
         bind => [2, L5J2B5, 1450 Acme Cr., Suite 4, ON, 1, Canada, Toronto]
    [EL Fine]: Connection(876215)--INSERT INTO GRIDCACHE_EMPLOYEE (ID, LASTNAME, FIRSTNAME, VERSION, ADDRESS_ID) VALUES (?, ?, ?, ?, ?)
    [EL Fine]: Connection(876215)--
         bind => [1, Smith, Bob, 1, 2]
    [EL Fine]: Connection(876215)--INSERT INTO GRIDCACHE_PHONE (ID, AREACODE, NUM, TYPE, VERSION, OWNER_ID) VALUES (?, ?, ?, ?, ?, ?)
    [EL Fine]: Connection(876215)--
         bind => [3, 613, 5558812, Work, 1, 1]
    [EL Config]: Connection(14361585)--disconnect
    

    EclipseLinkによってIDが更新され、SEQUENCE表が生成された後、3つの表にIDが挿入されます。このラボでは、すべての表に接頭辞GRIDCACHE_が付いています。

  4. gridcache.example.QueryExample1を実行します。これにより、JPQLですべてのEmployeeが問合せされ、EntityManager.findコールで単一のEmployeeが問合せされて、結果が出力されます。

    ...
    List<Employee> employees = em.createQuery("select e from Employee e").getResultList();
    ...
      Employee employee = em.find(Employee.class, employeeId);
    ...
    

    コンソール出力は次のようになります。

    ------------------JPQL Query
    [EL Fine]: Connection(876215)--SELECT ID, LASTNAME, FIRSTNAME, VERSION, ADDRESS_ID FROM GRIDCACHE_EMPLOYEE
    l2.model.Employee@e33e18(1: Smith, Bob)
    [EL Fine]: Connection(876215)--SELECT ID, POSTALCODE, STREET, PROVINCE, VERSION, COUNTRY, CITY FROM GRIDCACHE_ADDRESS WHERE (ID = ?)
         bind => [2]
         City: Toronto
    [EL Fine]: Connection(876215)--SELECT ID, AREACODE, NUM, TYPE, VERSION, OWNER_ID FROM GRIDCACHE_PHONE WHERE (OWNER_ID = ?)
         bind => [1]
         l2.model.PhoneNumber@21d23b(3: Work: 613-5558812)
    ------------------em.find Query
         l2.model.Employee@e33e18(1: Smith, Bob)
         City: Toronto
         l2.model.PhoneNumber@21d23b(3: Work: 613-5558812)
    

    EclipseLinkは、次の3つのSELECT文を発行します。

    • すべてのEmployeeを読み取るためのSELECT文

    • 1つのEmployeeのAddressを読み取るためのSELECT文

    • そのPhoneNumberを読み取るためのSELECT文

データベース問合せを行わなくてもローカル・キャッシュ内にEmployeeが見つかったため、EntityManager.find()を実行してもSQL文は発行されません。

Coherenceグリッド・キャッシュの構成

CoherencにキャッシュするようEclipseLinkに対して指示するには、CoherenceInterceptorをエンティティのキャッシュ・インターセプタとして構成する必要があります。Coherenceのインターセプタは、キャッシュのすべてのgetおよびput操作をEclipseLinkの組込み共有キャッシュではなくCoherenceに再ルーティングします。このような構成(図17を参照)は、キャッシュアサイドと呼ばれます。

図17 共有(L2)キャッシュとしてのCoherence

図17の説明が続きます
「図17 共有(L2)キャッシュとしてのCoherence」の説明

次の例に示すように、単一パラメータとしてCoherenceInterceptor.classを持つすべてのラボ・エンティティに@CacheInterceptor注釈を追加します。

import oracle.eclipselink.coherence.integrated.cache.CoherenceInterceptor;
import org.eclipse.persistence.annotations.CacheInterceptor;
 
@CacheInterceptor(CoherenceInterceptor.class)
public class Employee implements Serializable {
...

Coherenceキャッシュ構成

ラボには、coherence-cache-config.xmlファイルが含まれています。このラボ構成ファイル内では、すべてのエンティティが同じように構成されています。このファイルを編集する必要はありませんが、次の要素には注意してください。

<caching-scheme-mapping>
  <cache-mapping>
    <cache-name>*</cache-name>
    <scheme-name>eclipselink-distributed</scheme-name>
  </cache-mapping>
</caching-scheme-mapping>

cache-name要素の中のアスタリスク*は、任意のエンティティ名と一致します。TopLink Gridはデフォルトで、関連付けられたキャッシュの名前としてこのエンティティ名を使用します。この動作をオーバーライドするには、次の例に示すように、エンティティに対してEclipseLinkの@Property注釈を使用します。

@Property(name="coherence.cache.name", value="Employee")
@CacheInterceptor(CoherenceInterceptor.class)
public class Employee implements Serializable {
...

これらのラボでは、キャッシュ名はデフォルトでエンティティ名になります。

グリッド・キャッシュ・ラボでは、すべてのエンティティが、分散(パーティション)キャッシュであるeclipselink-distributedという名前のキャッシュ・スキームを使用しています。この例に示しているように、分散バッキング・マップ・スキームのeclipselink-distributedでは、エンティティ・リレーションシップのシリアライズをサポートするためのシリアライザが構成されています。

<caching-schemes>
  <distributed-scheme>
    <scheme-name>eclipselink-distributed</scheme-name>
    <service-name>EclipseLinkJPA</service-name>
  <!--
   Configure a wrapper serializer to support serialization of
   relationships.
  -->
  <serializer>
    <class-name>
      oracle.eclipselink.coherence.integrated.cache.WrapperSerializer
    </class-name>
  </serializer>
...

Coherenceを使用したラボ1の実行

Coherenceへのキャッシュのためのエンティティの構成と、coherence-cache-config.xmlファイルの定義が完了したので、Coherenceを使用してラボを再実行できます。

  1. データベースをリセットします。これには、「Project Explorer」ビューで「Lab 1-TopLinkGrid Grid Cache」プロジェクトを右クリックしてポップアップ・メニューから「JPA」→「Generate Tables from Entities…」を選択し、ラボ表を削除してから作成します。

  2. gridcache.example.StartCacheServerを実行して、Coherenceキャッシュ・サーバーを起動します。Coherenceを使用するよう構成した後は、キャッシュ・サーバーを実行する必要があります。


    ヒント:

    Eclipseで複数のプログラムを実行している場合、各プログラムのコンソールを切り替えるには、ドロップダウン・リストを使用します(図18を参照)。コンソール出力を確認する際は、表示されているコンソールがキャッシュ・サーバー・コンソールか、それとも例コンソールかに注意してください。

    図18 Eclipseコンソール

    出力コンソールを切り替えるには、ドロップダウン・リストを使用します。
  3. gridcache.example.InsertExampleを実行して、データベース内にexampleエンティティを作成し、Coherenceキャッシュにそれを移入します。次の例に示すように、コンソールではCoherenceの起動メッセージとINSERT文の他に、主キーによってCoherenceに挿入されるエンティティを示すメッセージも表示されます。

    [EL Fine]: Coherence(PhoneNumber)::Put: 3 value: l2.model.PhoneNumber@59cbda(3: Work: 613-5558812)
    [EL Fine]: Coherence(Employee)::Put: 1 value: l2.model.Employee@11c55bb(1: Smith, Bob)
    [EL Fine]: Coherence(Address)::Put: 2 value: l2.model.Address@135133(Toronto)
    
  4. gridcache.example.QueryExample1を実行します。コンソールには、JQPL問合せselect e from Employee eにより返されたすべてのEmployeeに対して1つのSELECT文のみが表示されます。また、Coherenceの対話を記録したメッセージも表示されます。この出力を、QueryExample1を実行したときに生成される出力と比較してから、Coherencキャッシュを有効化してください。

  5. gridcache.example.QueryExample2を実行して、一連のEntityManager(アプリケーション・サーバーにデプロイされるアプリケーション用など)があるときに、どのデータベース問合せが生成されるかを示します。この例は、以降のラボで生成される出力と比較する際に便利です。

ラボ2: グリッド読取り構成

「ラボ1: グリッド・キャッシュ構成」では、Coherenceを共有エンティティ・キャッシュとして構成する方法について説明しました。このラボでは、すべての読取り問合せ(selectおよびfind)をCoherenceに送ることにより、Coherenceの用途を拡張します。このグリッド読取り構成においては、すべての読取り操作はCoherenceに送られますが、書込み操作はEclipseLinkによって処理されてデータベースに送られます。この構成はリードスルーと呼ばれます(例19を参照)。データの可用性を高め、データベースを常に最新の状態に保つ必要がある場合には、この構成を使用してください。この構成ではJTAがサポートされているため、分散トランザクションに参加できます。Coherenceは、JTAトランザクション全部がコミットされた後に更新されます。

図19 グリッド読取り構成

図19の説明が続きます
「図19 グリッド読取り構成」の説明

グリッド読取りの構成

グリッド読取り構成は、グリッド・キャッシュ構成を拡張したものです。キャッシュ・インターセプタの他にも様々な読取り問合せタイプがCoherenceに送られます。構成を簡単にするために、TopLink Gridには、必要な構成変更(ラボ1で構成したキャッシュ・インターセプタの設定など)を実行するEclipseLinkカスタマイザ・クラスが用意されています。

CoherenceReadCustomizerは、次に示すように、EclipseLink @Customizer注釈を使用して構成します。

import oracle.eclipselink.coherence.integrated.config.CoherenceReadCustomizer;
import org.eclipse.persistence.annotations.Customizer;
 
@Customizer(CoherenceReadCustomizer.class)
public class Employee implements Serializable {

また、persistence.xmlおよびeclipselink-orm.xml内でカスタマイザを指定することもできます。

「Project Explorer」ビューから「Lab 2-TopLinkGrid Grid Read project」を右クリックし、ポップアップ・メニューから「Open Project」を選択します。Eclipseにより、プロジェクト内にJPAエンティティに対応する表がないことによるエラーがレポートされることがあります。このエラーは、表を生成することによって解決します。

前出のコード例で示したように、@Customizer(CoherenceReadCustomizer.class)をすべてのラボ・エンティティに追加します。

Coherenceキャッシュ構成

すべての読取り問合せがCoherenceに送られるという点で、coherence-cache-config.xmlはグリッド・キャッシュ構成の構成ファイルとは異なります。特に、(オブジェクトがCoherenceに含まれない場合は)Coherenceが個々のオブジェクトについてデータベースを問合せできるようにCacheLoaderを構成することに意味があります。

次の例は、ラボ2のcoherence-cache-config.xmlのコードの一部です。

<distributed-scheme>
  <scheme-name>eclipselink-distributed-readonly</scheme-name>
  <service-name>EclipseLinkJPAReadOnly</service-name>
  ...
  <backing-map-scheme>
    <read-write-backing-map-scheme>
      ...
      <!-- Define the cache scheme -->
      <cachestore-scheme>
        <class-scheme>
          <class-name>
            oracle.eclipselink.coherence.integrated.EclipseLinkJPACacheLoader
          </class-name>
          <init-params>
            <init-param>
              <param-type>java.lang.String</param-type>
              <param-value>{cache-name}</param-value>
            </init-param>
            <init-param>
              <param-type>java.lang.String</param-type>
              <param-value>employee</param-value>
            </init-param>
          </init-params>
        </class-scheme>
      </cachestore-scheme>
      <read-only>true</read-only>
    </read-write-backing-map-scheme>
  </backing-map-scheme>
  <autostart>true</autostart></distributed-scheme>

oracle.eclipselink.coherence.integratedパッケージからのバッキング・マップに対してEclipseLinkJPACacheLoaderを構成します。この統合パッケージ名に注意してください。このラボと同じようにJPAフロント・エンドとともにTopLink Gridを使用する場合は、このCacheLoaderを使用してください。

従来型のCoherence APIベースのアプリケーションでTopLink Grid CacheLoaderを使用する場合は、oracle.eclipselink.coherence.standaloneパッケージ内のEclipseLinkJPACacheLoaderを使用してください。

Coherenceを使用したラボ2の実行

CoherenceReadCustomizerを使用してエンティティを構成し、coherence-cache-config.xml内でCacheLoaderとともにキャッシュを構成した後は、ラボを実行できます。

  1. 前のラボから引き続き実行されているCacheServerがあれば、停止します。

  2. データベース接続がデフォルトとは異なる場合、META-INF/persistence.xmlファイル内の次のEclipseLink JDBCプロパティを更新する必要があります。

    • eclipselink.jdbc.driver

    • eclipselink.jdbc.url

    • eclipselink.jdbc.user

    • eclipselink.jdbc.password

  3. 「Project Explorer」ビューからラボ2のプロジェクトを右クリックし、ポップアップ・メニューから「JPA」→「Generate Tables from Entities…」を選択してデータベースをリセットします。

  4. gridread.example.StartCacheServerを実行して、Coherenceキャッシュ・サーバーを起動します。

  5. gridread.example.InsertExampleを実行して、データベース内にexampleエンティティを作成し、Coherenceキャッシュにそれを移入します。次の例に示すように、コンソールではCoherenceの起動メッセージとINSERT文の他に、主キーによってCoherenceに挿入されるエンティティを示すメッセージも表示されます。

    [EL Fine]: Connection(4889213)--INSERT INTO GRIDREAD_ADDRESS (ID, POSTALCODE, STREET, PROVINCE, VERSION, COUNTRY, CITY) VALUES (?, ?, ?, ?, ?, ?, ?)
    [EL Fine]: Connection(4889213)--
         bind => [2, L5J2B5, 1450 Acme Cr., Suite 4, ONT, 1, Canada, Toronto]
    [EL Fine]: Connection(4889213)--INSERT INTO GRIDREAD_EMPLOYEE (ID, LASTNAME, FIRSTNAME, VERSION, ADDRESS_ID) VALUES (?, ?, ?, ?, ?)
    [EL Fine]: Connection(4889213)--
         bind => [1, Smith, Bob, 1, 2]
    [EL Fine]: Connection(4889213)--INSERT INTO GRIDREAD_PHONE (ID, AREACODE, NUM, TYPE, VERSION, OWNER_ID) VALUES (?, ?, ?, ?, ?, ?)
    [EL Fine]: Connection(4889213)--
         bind => [3, 613, 5558812, Work, 1, 1]
    [EL Fine]: Coherence(Employee)::Put: 1 value: read.model.Employee@948069(1: Smith, Bob)
    [EL Fine]: Coherence(Address)::Put: 2 value: read.model.Address@1b59919(Toronto)
    [EL Fine]: Coherence(PhoneNumber)::Put: 3 value: read.model.PhoneNumber@1588325(3: Work: 613-5558812)
    

    コンソール出力は、ラボ1でグリッド・キャッシュ構成を使用したときと同様になります。

  6. gridread.example.QueryExample1を実行します。QueryExample1コンソールでは、EclipseLinkによってJQPL問合せselect e from Employee eからSELECT文は発行されていません。これは、問合せがCoherenceフィルタに変換され、評価のためにCoherenceに渡されたからです。

この出力を、「ラボ3: グリッド・エンティティ構成」gridcache.example.QueryExample1を実行したときの出力と比較します。

  • ラボ1では、JPQL問合せは常にSQLに変換され、データベースで実行されています。

  • ラボ2では、EntityManager.find()はCoherenceに照らして評価されており、SQLは生成されていません。

ラボ3: グリッド・エンティティ構成

グリッド・エンティティ構成はグリッド読取り構成を拡張したものであり、すべての書込み問合せ(INSERTUPDATEおよびDELETE)をデータベースではなくCoherenceにリダイレクトします。レスポンス・タイムを高速にする必要があり、ライトビハインド方針を使用して定期的に更新をデータベースにフラッシュできる場合は、この構成が適しています。これはCoherenceキャッシュに対してCacheStoreを構成することで実現できます。この構成は、リードスルーともライトスルーとも呼ばれることがあります(図20)。

この構成の欠点として考えられるのは、JTAトランザクションに参加できなくなること、EclipseLinkがバッチ書込みのように最適化を書き込むこと、およびCoherenceキャッシュが更新をデータベースに書き込む順序が予測不可能であるために参照整合性規則を緩和する必要があることです。

図20 グリッド・エンティティ構成

図20の説明が続きます
「図20 グリッド・エンティティ構成」の説明

グリッド・エンティティの構成

「ラボ2: グリッド読取り構成」の場合と同様に、次の例に示すように、個々のエンティティでグリッド・エンティティをCoherenceReadWriteCustomizerというEclipseLinkカスタマイザによって有効化します。

import oracle.eclipselink.coherence.integrated.config.CoherenceReadWriteCustomizer;
import org.eclipse.persistence.annotations.Customizer;
 
@Customizer(CoherenceReadWriteCustomizer.class)
public class Employee implements Serializable {
 

「Project Explorer」ビューから「Lab 3-TopLinkGrid Grid Entity」プロジェクトを右クリックし、ポップアップ・メニューから「Open Project」を選択します。他のラボの場合と同様に、プロジェクト内にJPAエンティティに対応する表がないことによるエラーが表示されることがあります。このエラーは、表を生成すると解決されます。

前出のコード例で示したように、@Customizer(CoherenceReadWriteCustomizer.class)をすべてのラボ・エンティティに追加します。

Coherenceキャッシュ構成

更新をデータベースに伝播するには、Coherenceエンティティ・キャッシュをCacheStoreとともに構成する必要があります。CacheStoreはCacheLoaderと同様の方法で構成します。違いは、読取り操作だけでなく書込み操作もサポートするという実装にあります。

  <distributed-scheme>
    <scheme-name>eclipselink-distributed-readwrite</scheme-name>
      ...
      <cachestore-scheme>
        <class-scheme>
          <class-name>
            oracle.eclipselink.coherence.integrated.EclipseLinkJPACacheStore
          </class-name>
...

「ラボ2: グリッド読取り構成」の場合と同様に、プログラミングAPIとしてJPAを使用しているため、EclipseLinkJPACacheStore統合パッケージ内にあります。

Coherenceを使用したラボ3の実行

CoherenceReadWriteCustomizerを使用してエンティティを構成し、coherence-cache-config.xml内でCacheStoreとともにキャッシュを構成した後は、ラボを実行できます。

  1. 前のラボから引き続き実行されているCacheServerがあれば、停止します。

  2. データベース接続がデフォルトとは異なる場合、META-INF/persistence.xmlファイル内の次のEclipseLink JDBCプロパティを更新する必要があります。

    • eclipselink.jdbc.driver

    • eclipselink.jdbc.url

    • eclipselink.jdbc.user

    • eclipselink.jdbc.password

  3. 「Project Explorer」ビューからラボ3のプロジェクトを右クリックし、ポップアップ・メニューから「JPA」→「Generate Tables from Entities…」を選択してデータベースをリセットします。

  4. gridentity.example.StartCacheServerを実行して、Coherenceキャッシュ・サーバーを起動します。

  5. gridentity.example.InsertExampleを実行して、データベース内にexampleエンティティを作成し、Coherenceキャッシュにそれを移入します。InsertExampleコンソールでは、エンティティがその主キーによってCoherenceに挿入されることを示すメッセージは表示されますが、INSERT文は表示されません。

    [EL Fine]: Coherence(Employee)::ConditionalPut: 1 value: readwrite.model.Employee@b9b618(1: Smith, Bob)
    [EL Fine]: Coherence(PhoneNumber)::ConditionalPut: 3 value: readwrite.model.PhoneNumber@800aa1(3: Work: 613-5558812)
    [EL Fine]: Coherence(Address)::ConditionalPut: 2 value: readwrite.model.Address@169dd64(Toronto)
    

    CacheServerコンソールにはデータベース問合せが表示されます。これは、CoherenceReadWriteが構成されている場合、QueryExampleクライアント・プログラム内の問合せはすべてCoherenceに送られるためです。エンティティがCoherenceに挿入されると、CacheStoreは挿入されたエンティティが新規のエンティティかどうかを判断します。新規のエンティティであれば、INSERT文が生成されます。更新されたエンティティであれば、UPDATE文が生成されます。

  6. グリッド・エンティティ構成における読取り動作は「ラボ2: グリッド読取り構成」の構成と同じなので、gridentity.example.QueryExample1を実行した結果は、gridread.example.QueryExample1の結果と同じになります。コンソールでは、JQPL問合せselect e from Employee eの結果としてのSELECT文は生成されません。

まとめ

TopLink Gridは、EclipseLink JPAとOracle Coherenceとの統合を提供します。このラボでは、Coherenceを共有L2キャッシュとして使用する構成や、Coherenceをデータ・ソースとして使用し、JPQL問合せをグリッド内で実行されるフィルタに変換する構成など、各種の構成について説明しました。

これらのラボで示されているとおり、CoherenceをTopLink Gridとともに構成するのはシンプルで簡単な作業であり、JPAアプリケーションに対する変更もごく限られています。