Oracle® Fusion Middleware

Oracle Coherenceの統合

12c (12.2.1.1)

E77325-01(原本部品番号:E69629-01)

2016年6月

開発者および管理者を対象としており、Oracle CoherenceをCoherence*Web、EclipseLink JPA、Hibernate、Spring、memcachedアダプタおよびCoherence GoldenGate HotCacheと統合する方法について説明します。

Oracle Fusion Middleware Oracle Coherenceの統合, 12c (12.2.1.1)

E77325-01

Copyright © 2008, 2016, Oracle and/or its affiliates. All rights reserved.

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

このソフトウェアまたはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアまたはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用する際、このソフトウェアまたはハードウェアを安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。適用されるお客様とOracle Corporationとの間の契約に別段の定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。適用されるお客様とOracle Corporationとの間の契約に定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

目次

タイトルおよび著作権情報

はじめに

- 対象読者

- ドキュメントのアクセシビリティについて

- 関連ドキュメント

- 表記規則

このガイドで説明する新機能

- 新機能と変更点

- このドキュメントにおけるその他の大きな変更

1 TopLink GridとOracle Coherenceの統合

- 1.1 TopLink Gridとは

- 1.1.1 グリッド基盤のJPA構成とは

- 1.1.2 Oracle CoherenceでTopLink Gridを使用する利点とは

- 1.2 必須ファイル

- 1.3 グリッド基盤のJPA構成

- 1.3.1 グリッド基盤のJPAの理解

- 1.3.2 グリッド基盤のJPAのAPI

- 1.3.3 グリッド・キャッシュ構成

- 1.3.3.1 グリッド・キャッシュ構成でのオブジェクトの読取り

- 1.3.3.2 グリッド・キャッシュ構成でのオブジェクトの書込み

- 1.3.3.3 グリッド・キャッシュ構成の例

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

- 1.3.3.3.2 グリッド・キャッシュ構成のエンティティの構成

- 1.3.3.3.3 グリッド・キャッシュ構成のオブジェクトの挿入

- 1.3.3.3.4 グリッド・キャッシュ構成のオブジェクトの問合せ

- 1.3.4 グリッド読取り構成

- 1.3.4.1 グリッド読取り構成でのオブジェクトの読取り

- 1.3.4.2 グリッド読取り構成でのオブジェクトの書込み

- 1.3.4.3 グリッド読取り構成の例

- 1.3.4.3.1 グリッド読取り構成のキャッシュの構成

- 1.3.4.3.2 グリッド読取り構成のオブジェクトの読取り

- 1.3.4.3.3 グリッド読取り構成のオブジェクトの挿入

- 1.3.4.3.4 グリッド読取り構成のオブジェクトの問合せ

- 1.3.5 グリッド・エンティティ構成

- 1.3.5.1 グリッド・エンティティ構成でのオブジェクトの読取り

- 1.3.5.2 グリッド・エンティティ構成でのオブジェクトの書込み

- 1.3.5.3 グリッド・エンティティ構成でのオブジェクトの書込みに対する制約

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

- 1.3.5.4.1 グリッド・エンティティ構成のキャッシュの構成

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

- 1.3.5.4.3 グリッド・エンティティ構成のオブジェクトの永続化

- 1.3.5.4.4 グリッド・エンティティ構成のオブジェクトの問合せ

- 1.3.6 グリッド読取りおよびグリッド・エンティティのフェイルオーバーの処理

- 1.3.7 エンティティ・リレーションシップのラップとアンラップ

- 1.3.8 問合せの操作

- 1.3.8.1 IDによるオブジェクトの問合せ

- 1.3.8.2 基準を使用したオブジェクトの問合せ

- 1.3.8.3 問合せでの索引の使用

- 1.3.8.4 問合せに対する制約

- 1.4 EclipseLink Native ORMの構成

- 1.4.1 EclipseLink Native ORMの理解

- 1.4.2 EclipseLink Native ORMのAPI

- 1.4.3 修正メソッドの構成

- 1.4.3.1 JDeveloperでの修正メソッドの構成

- 1.4.4 EclipseLink Native ORMキャッシュ・ストアおよびキャッシュ・ローダーの構成

- 1.5 TopLink GridおよびCoherenceでのPOFシリアライズの使用

- 1.5.1 シリアライズ・ルーチンの実装

- 1.5.2 キャッシュ構成ファイルの定義

- 1.5.3 POF構成ファイルの定義

- 1.6 ベスト・プラクティス

- 1.6.1 バイト・コード・ウィービングでのコンパイル済Javaクラスの変更

- 1.6.2 遅延ロードでのデータベース問合せの遅延

- 1.6.3 TopLink Gridを使用するアプリケーションに対するニア・キャッシュの定義

- 1.6.4 キャッシュ構成において接頭辞付きのキャッシュ名でワイルドカードが使用されるようにする

- 1.6.5 デフォルト・キャッシュ名のオーバーライド

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

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

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

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

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

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

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

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

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

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

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

- 2.2.2.2.2 JPAの構成

- 2.2.2.2.3 JPA用のCoherenceキャッシュの構成

- 2.2.2.2.4 永続性ユニットの構成

3 CoherenceアプリケーションとCoherence*Webの統合

- 3.1 Coherenceキャッシュ情報とセッション情報のマージ

4 HibernateとCoherenceの統合

5 CoherenceとSpringの統合

6 CoherenceログでのECIDの有効化

7 Oracle Coherence GoldenGate HotCacheとの統合

- 7.1 概要

- 7.2 HotCacheの機能

- 7.2.1 GoldenGate JavaアダプタによるJPAマッピング・メタデータの使用方法

- 7.2.2 サポートされているデータベース操作

- 7.3 前提条件

- 7.4 GoldenGateの構成

- 7.4.1 表の変更のモニター

- 7.4.2 現在のユーザーが実行した変更のフィルタ処理

- 7.5 HotCacheの構成

- 7.5.1 GoldenGate for Javaのプロパティでのプロパティ・ファイルの作成

- 7.5.2 プロパティ・ファイルへのJavaブート・オプションの追加

- 7.5.2.1 Javaクラスパス・ファイル

- 7.5.2.2 HotCache関連プロパティ

- 7.5.2.3 Coherence関連プロパティ

- 7.5.2.4 ロギング・プロパティ

- 7.5.3 Coherence*Extend接続情報の指定

- 7.6 GoldenGate Javaクライアントの構成

- 7.6.1 GoldenGate Javaクライアント抽出ファイルの編集

- 7.7 HotCacheでのPortable Object Formatの使用

- 7.8 TopLink Gridアプリケーション用のラッパー・クラスの有効化

8 memcachedクライアントとOracle Coherenceの併用

- 8.1 Oracle Coherence memcachedアダプタの概要

- 8.2 memcachedアダプタの設定

- 8.2.1 memcachedアダプタ・ソケット・アドレスの定義

- 8.2.2 memcachedアダプタ・プロキシ・サービスの定義

- 8.3 memcachedアダプタへの接続

- 8.4 memcachedクライアント通信の保護

- 8.4.1 memcachedクライアント認証の実行

- 8.4.2 memcachedクライアント認可の実行

- 8.5 memcachedクライアントとCoherenceクライアント間のデータ共有

- 8.5.1 memcachedクライアントのPOFの構成

- 8.5.2 POFを使用するmemcachedクライアントの作成

はじめに

Oracle Coherence (Coherence)は、クラスタ化されたJava Platform Enterprise Edition (Java EE)アプリケーションおよびアプリケーション・サーバーを対象とする、JCache準拠のメモリー内キャッシュおよびデータ管理ソリューションです。Coherenceを使用すると、クラスタ内のデータを単一のサーバー上と同じように簡単に共有および管理できます。これを実現するために、データ更新の調整には、クラスタ全体の同時実行性制御を使用し、クラスタ全体へのデータ変更のレプリケートおよび配布には、使用可能な最高のパフォーマンスを提供するクラスタ化プロトコルを使用しています。また、データ変更の通知を要求するすべてのサーバーに対してその通知を配信します。開発者は、標準的なJavaコレクションAPIを採用したCoherenceの機能を利用して、データにアクセスしたり、データを変更したりできます。また、標準のJavaBeansイベント・モデルを使用してデータ変更の通知を受信できます。

対象読者

このガイドは、CoherenceをTopLink-Grid、JPA、Hibernate、Spring、memcachedアダプタおよびCoherence GoldenGate HotCacheと統合するソフトウェア開発者およびアーキテクトを対象としています。

ドキュメントのアクセシビリティについて

Oracleのアクセシビリティについての詳細情報は、Oracle Accessibility ProgramのWebサイト(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc)を参照してください。

Oracleサポートへのアクセス

サポートをご購入のOracleのお客様は、My Oracle Supportにアクセスして電子サポートを受けることができます。詳細情報は(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=info) か、聴覚に障害のあるお客様は (http://www.oracle.com/pls/topic/lookup?ctx=acc&id=trs)を参照してください。

関連ドキュメント

Oracle Coherenceの詳細は、次を参照してください。

- Oracle Coherence*WebでのHTTPセッション・マネージメントの管理

- Oracle Coherenceの管理

- Oracle Coherenceでのアプリケーションの開発

- Oracle Coherenceリモート・クライアントの開発

- Oracle Coherenceのインストール

- Oracle Coherenceのマネージメント

- Oracle Coherenceの保護

- Oracle Coherence Java APIリファレンス

- Oracle Coherence .NET APIリファレンス

- Oracle Coherence C++ APIリファレンス

- Oracle Coherenceリリース・ノート

表記規則

このマニュアルでは次の表記規則を使用します。

規則

意味

太字

太字は、操作に関連するGraphical User Interface要素、または本文中で定義されている用語および用語集に記載されている用語を示します。

イタリック体

イタリックは、ユーザーが特定の値を指定するプレースホルダ変数を示します。

固定幅フォント

固定幅フォントは、段落内のコマンド、URL、サンプル内のコード、画面に表示されるテキスト、または入力するテキストを示します。

このガイドで説明する新機能

次のトピックでは、Oracle Coherenceの新機能と変更された機能について、およびこのガイドに記載されるその他の重要な変更について紹介し、詳細情報へのリンクを提供します。

新機能と変更点

12c (12.2.1.1)での新機能と変更された機能

Oracle Coherence 12c (12.2.1.1)には、このドキュメントに記載する新機能および変更された機能は含まれていません。

12c (12.2.1)での新機能と変更された機能

このドキュメントでのOracle Coherence 12c (12.2.1)に含まれる新機能と変更された機能は次のとおりです。

- GoldenGate HotCachへのサポートが更新されました。HotCache機能の使用方法の詳細は、Oracle Coherence GoldenGate HotCacheとの統合を参照してください。

このドキュメントにおけるその他の大きな変更

12c (12.2.1.1)に関するこのドキュメントにおけるその他の大きな変更

12c (12.2.1.1)では、このガイドにおける重要な変更はありません。

12c (12.2.1)に関するこのドキュメントにおけるその他の大きな変更

12c (12.2.1)でこのガイドは何箇所か更新されています。次の表に、追加または変更された項を示します。

- Toplinkキャッシュ・ストアおよびキャッシュ・ローダーは、サポートされなくなりました。

1 TopLink GridとOracle Coherenceの統合

この章では、Oracle TopLink GridでOracle Coherenceを使用してJava Persistence API (JPA)アプリケーションをスケール・アウトできるようにする方法について説明します。TopLink Gridは、Coherenceを分散共有(L2)キャッシュとして使用することから、JP QL問合せをCoherenceに送ってグリッド全体でパラレル実行してデータベース負荷を削減することまで、スケール・アウトに関する多数のオプションをアプリケーションに提供します。TopLink Gridでは、スケール・アウトするアプリケーションをリライトする必要はありません。JPAへの投資を使用したまま、Coherenceのスケーラビリティを利用できます。

この章の構成は、次のとおりです。

- TopLink Gridとは

- 必須ファイル

- グリッド基盤のJPA構成

- EclipseLink Native ORMの構成

- TopLink GridおよびCoherenceでのPOFシリアライズの使用

- ベスト・プラクティス

1.1 TopLink Gridとは

Oracle TopLink Gridは、EclipseLink JPAとCoherenceとの統合を可能にするOracle TopLinkの機能です。標準のJPAアプリケーションは、プライマリ・データ・ストア(一般的にリレーショナル・データベース)と直接対話します。ただし、TopLink Gridの場合、ドメイン・モデルの一部またはすべてをCoherenceデータ・グリッドに格納できます。この構成は、「グリッド基盤のJPA」とも呼ばれています。

TopLink Gridを簡単に構成して、Coherenceのプライマリ・データ・ストアとしての使用、グリッドに対する問合せの実行、およびCoherenceによる新規データと変更データにおける永続性の管理ができます。Coherenceでは、JPAとデータ・ストア間のレイヤーが提供されており、すべてのアプリケーション・インスタンスからデータベース・コールを直接オフロードできます。これにより、クラスタ化されたアプリケーションのデプロイメントでは、通常のデータベース操作の限界を超えるスケーラビリティが得られます

Oracle Technology NetworkのOracle TopLink Gridページには、TopLink Gridに対するCoherenceの追加情報とコード例があります。

http://www.oracle.com/technetwork/middleware/ias/tl-grid-097210.html

1.1.1 グリッド基盤のJPA構成とは

これらはアプリケーションで使用できる典型的なグリッド基盤のJPA構成です。

- グリッド・キャッシュ構成。CoherenceをTopLink L2(共有)キャッシュとして使用します。この構成では、Coherenceのキャッシュにすべて事前ロードできずデータベースでホストされるデータに依存するJPAアプリケーションにCoherenceのデータ・グリッドを適用します。事前ロードができない理由には、Coherenceのフィルタの機能セットを超える非常に複雑な問合せ、古いキャッシュの原因となるサード・パーティ製データベースによる更新、ネイティブSQL問合せ、ストアド・プロシージャやトリガーへの依存などがあります。
この構成では、ローカルL2キャッシュを調整することなく、TopLinkを大規模なクラスタにスケール・アップできます。エンティティに対する更新は、トランザクションがコミットされると即時にすべてのCoherenceクラスタ・メンバーで使用可能になります。詳細は、グリッド・キャッシュ構成を参照してください。

- グリッド読取り構成。この構成は、(比較的安定した)大容量データへ高速にアクセスして変更をデータベースへ同期的に書き込む必要のあるエンティティに最適です。これらのエンティティでは、Coherenceキャッシュへの移入にキャッシュ・ウォーミングが使用されますが、各問合せは必要に応じてデータベースに送信することもできます。詳細は、グリッド読取り構成を参照してください。

- グリッド・エンティティ構成。この構成は、(比較的安定した)大容量データへ高速にアクセスする必要があり、更新が比較的少ないアプリケーションに最適です。ライトビハインドを使用してこの構成をCoherenceキャッシュ・ストアと組み合せると、データベース更新を非同期に実行することにより、アプリケーションのレスポンス時間を向上させることができます。詳細は、グリッド・エンティティ構成を参照してください。

1.1.2 Oracle CoherenceでTopLink Gridを使用する利点とは

TopLink Gridには次のような利点があります。

- 標準JPAに合せた注釈またはXML構成を使用した単純なアプリケーション構成。

- 複雑なオブジェクト・グラフと関係をCoherenceに格納する機能。

- グリッドに格納するエンティティとバッキング・データベースに直接格納するエンティティを選択する機能。

- グリッド内のJP QL問合せを実行またはデータベースに対して直接実行できます。

- 即時関係と遅延関係の両方でエンティティをCoherenceに格納できます。

TopLink GridはEclipseLink JPA実装(EclipseLink)とOracle Coherenceとを統合するもので、これらの開発アプローチを提供します。

- JPAを使用してアプリケーションを構築し、データ・グリッドの機能を透過的に使用してスケーラビリティとパフォーマンスを向上させることができます。このグリッド基盤のJPAアプローチでは、TopLink GridはEclipseLink JPAがCoherenceを使用する方法を制御できる一連のキャッシュおよび問合せ構成オプションを提供します。これらの実装は、oracle.eclipselink.coherence.integratedパッケージ内にあります。詳細は、グリッド基盤のJPA構成を参照してください。

- 既存のNative ORMアプリケーションがある場合、それらとともにEclipseLink Native Object Relational Mapping (ORM)フレームワークを使用できます。Native ORMアプローチは、グリッド基盤のJPAと非常によく似ていますが、キャッシュの使用方法を構成するために注釈を使用しません。かわりに、このアプローチは、適切なキャッシュ動作を定義する修正メソッドを採用します。詳細は、EclipseLink Native ORMの構成を参照してください。

- Coherence APIをTopLink Gridによって支援されたキャッシュとともに使用して、JPAに対して実装された特殊なキャッシュ・ローダーおよびキャッシュ・ストア・インタフェースでリレーショナル・データにアクセスできます。
この従来のCoherenceアプローチでは、TopLink GridはEclipseLink JPA用に最適化されたoracle.eclipselink.coherence.standaloneパッケージにCacheLoaderおよびCacheStore実装を提供します。この手法については、TopLink GridとCoherenceクライアント・アプリケーションの使用を参照してください。

JPAアプリケーションをCoherenceのデータ・グリッドと統合する際は、可能性のあるメリットと制限事項に注意してください。あらゆる可能性を理解するためには、グリッドの動作およびグリッドとJPA構成との関連性について理解する必要があります。

1.2 必須ファイル

TopLink Gridを使用するための必須ファイルは、javax.persistence_2.2.0.0_1-0-2.jar、eclipselink.jarおよびtoplink-grid.jarです。Coherenceの標準インストールを実行した場合、これらのファイルは次の場所に格納されます。

- .../Oracle_Home/oracle_common/modules/javax.persistence_2.2.0.0_1-0-2.jar

- .../Oracle_Home/oracle_common/modules/oracle.toplink12.1.3/eclipselink.jar

- .../Oracle_Home/oracle_common/modules/oracle.toplink12.1.3/toplink-grid.jar

1.3 グリッド基盤のJPA構成

この項では、グリッド基盤のJPAと、グリッド・キャッシュ構成、グリッド読取り構成およびグリッド・エンティティ構成でのオブジェクトの読取りおよび書込み方法について説明します。また、これらの構成でCoherenceキャッシュに対して問合せを実行する方法についても説明します。

この項は、次のトピックで構成されています。

- グリッド基盤のJPAの理解

- グリッド基盤のJPAのAPI

- グリッド・キャッシュ構成

- グリッド読取り構成

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

- グリッド読取りおよびグリッド・エンティティのフェイルオーバーの処理

- エンティティ・リレーションシップのラップとアンラップ

- 問合せの操作

1.3.1 グリッド基盤のJPAの理解

グリッド基盤のJPAという表現は、JPAとデータ・グリッドの機能を使用してスケーラビリティとパフォーマンスが向上したアプリケーションを構築することを意味します。グリッド基盤のJPAアプローチでは、TopLink Gridによって、キャッシュのセットと、EclipseLink JPAでのCoherenceの使用方法を制御できる問合せ構成オプションが提供されます。

Coherenceを分散共有(L2)キャッシュとして構成することも、Coherenceをプライマリ・データ・ストアとして使用することもできます。また、データベースのかわりにCoherenceデータ・グリッド内で問合せを実行するようエンティティを構成することもできます。こうすると、クラスタ化されたアプリケーション・デプロイメントを、データベースがボトルネックとなるような操作を越えて拡張できます。

図1-1に、アプリケーション、TopLink、Coherenceおよびデータベース間の関係を示します。

図1-1 グリッド基盤のJPAアプローチ

1.3.2 グリッド基盤のJPAのAPI

グリッド基盤のJPA構成で使用されるAPIは、toplink-grid.jarファイルに含まれています。表1-1に、グリッド基盤のJPA構成で使用されるoracle.eclipselink.coherence.integratedパッケージの主要クラスの一部をリストします。

表1-1 グリッド基盤のJPAアプリケーションを構築するためのTopLink Gridクラス

クラス名

説明

oracle.eclipseLink.coherence.integrated.EclipseLinkJPACacheLoader

Coherence CacheLoaderインタフェースのJPA対応バージョンを提供します。

oracle.eclipseLink.coherence.integrated.EclipseLinkJPACacheStore

Coherence CacheStoreインタフェースのJPA対応バージョンを提供します。

oracle.eclipselink.coherence.integrated.config.CoherenceReadCustomizer

Coherence読取り構成を有効にします。

oracle.eclipselink.coherence.integrated.config.CoherenceReadWriteCustomizer

Coherence読取り/書込み構成を有効にします。

oracle.eclipselink.coherence.integrated.config.GridCacheCustomizer

キャッシュ・インスタンスを内部EclipseLink共有キャッシュのかわりにCoherenceにキャッシュできるようにします。内部TopLink L2キャッシュに対するすべてのコールは、Coherenceにリダイレクトされます。

oracle.eclipselink.coherence.integrated.querying.IgnoreDefaultRedirector

問合せがCoherenceキャッシュをバイパスし、データベースに直接送信されるようにします。

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

1.3.3 グリッド・キャッシュ構成

グリッド・キャッシュ構成は、TopLink Gridの基本構成とみなすことができます。この構成では、CoherenceがTopLink共有(L2)キャッシュとして機能します。これにより、Coherenceのキャッシュにすべて事前ロードできずデータベースでホストされるデータに依存するJPAアプリケーションに対してCoherenceのデータ・グリッドを適用できます。データを事前ロードできない理由には、Coherenceのフィルタの機能を超える非常に複雑な問合せ、サード・パーティ製データベースの更新による古いキャッシュ、およびネイティブSQL問合せ、ストアド・プロシージャ、トリガーへの依存などがあります。

CoherenceをTopLink Gridキャッシュとして使用すると、ローカル共有キャッシュを調整しなくても、TopLinkを大規模なクラスタにスケール・アップできます。エンティティに対する更新は、トランザクションがコミットされると即時にすべてのCoherenceクラスタ・メンバーで使用可能になります。

一般に、グリッド・キャッシュ構成の読取りおよび書込み操作には次の特徴があります。

- 主キー問合せでは、最初にCoherenceキャッシュからのエンティティの取得が試行されます。この試行に失敗すると、データベースが問合せされ、Coherenceキャッシュが問合せ結果で更新されます。次のグリッド・キャッシュ構成でのオブジェクトの読取りを参照してください。

- 非主キー問合せがデータベースに対して実行され、結果がCoherenceキャッシュに照らしてチェックされます。これによって、すでにキャッシュされているエンティティの構築によるパフォーマンスへの悪影響が回避されます。新しく問合せされたエンティティがCoherenceキャッシュに挿入されます。

- 書込み操作では、データベースが更新され、コミットに成功した場合は更新されたエンティティがCoherenceキャッシュに挿入されます。グリッド・キャッシュ構成でのオブジェクトの書込みを参照してください。

詳細な例については、グリッド・キャッシュ構成の例を参照してください。

Coherenceをエンティティの分散キャッシュとして使用するには、EclipseLinkで共有キャッシュを有効にする必要があります。共有キャッシュはすべてのエンティティに対してデフォルトで有効になっていますが、persistence.xmlファイルでeclipselink.cache.shared.defaultプロパティを設定することにより、デフォルトを明示的にtrueまたはfalseに設定できます。特定のエンティティでデフォルトをオーバーライドするには、@Cache注釈を使用するか、eclipselink-orm.xmlファイルで対応するXML <cache>要素を指定します。詳細は、次を参照してください。

http://wiki.eclipse.org/Using_EclipseLink_JPA_Extensions_(ELUG)#How_to_Use_the_.40Cache_Annotation

1.3.3.1 グリッド・キャッシュ構成でのオブジェクトの読取り

グリッド・キャッシュ構成では、最初にCoherenceキャッシュに送られる主キー問合せを除くすべての読取り問合せがデータベースに送られます。キャッシュ・ミスがあった場合は、データベース問合せが実行されます。

データベースから問合せされたすべてのエンティティはCoherenceキャッシュに挿入されます。これにより、エンティティはすべてのクラスタ・メンバーに対して即時に使用可能になります。TopLinkはデフォルトで、データベース結果からの新しいエンティティの構成を回避するためにキャッシュを利用するため、これが非常に有効になります。

TopLinkは、問合せの結果返された行ごとに、結果の行の主キーを使用して、キャッシュから対応するエンティティを問い合せます。キャッシュにエンティティが含まれていれば、そのエンティティが使用され、新しいエンティティは構築されません。このアプローチではオブジェクトのビルドに関連するコストを排除することで問合せのコストを削減できるため、特にウォーム・キャッシュを使用する場合は、アプリケーションのパフォーマンスが大幅に向上する可能性があります。

図1-2に、グリッド・キャッシュ構成での読取り問合せのパスを示します。

1. アプリケーションがfind問合せを発行します。

2. 主キー問合せでは、TopLinkは最初にCoherenceキャッシュを問い合せます。

3. オブジェクトがCoherenceキャッシュに存在しない場合、TopLinkはデータベースを問い合せます。
主キー問合せを除くすべての読取り問合せでは、TopLinkは最初にデータベースを問い合せます。

4. 読み取られたオブジェクトは、Coherenceキャッシュに挿入されます。

図1-2 グリッド・キャッシュ構成でのオブジェクトの読取り

1.3.3.2 グリッド・キャッシュ構成でのオブジェクトの書込み

グリッド・キャッシュ構成では、TopLinkがすべてのデータベース書込み操作(挿入、更新、削除)を実行します。その後、Coherenceキャッシュがデータベースへの変更を反映するように更新されます。TopLinkには、大量のデータを書き込む際のパフォーマンス機能が数多く用意されています(バッチ書込み、パラメータ・バインディング、ストアド・プロシージャ・サポート、データベース制約を満たすための文の順序付けなど)。

図1-3に、グリッド・キャッシュ構成でのオブジェクトの書込みと永続化のパスを示します。

1. アプリケーションがcommit問合せを発行します。

2. TopLinkがデータベースを更新します。

3. トランザクションが正常に完了すると、TopLinkはCoherenceキャッシュを更新します。

図1-3 グリッド・キャッシュ構成でのオブジェクトの書込みおよび永続化

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

これらの例のコードは、次のURLで入手できます。

http://www.oracle.com/technetwork/middleware/toplink/examples-325517-en-ca.html

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

例1-1のキャッシュ構成ファイル(coherence-cache-config.xml)は、キャッシュを定義し、ラッパー・シリアライザを構成して関係のシリアライズをサポートします。

例1-1 グリッド・キャッシュ構成のキャッシュの構成

<cache-config>
<caching-scheme-mapping>
<cache-mapping>
<cache-name>*</cache-name>
<scheme-name>eclipselink-distributed</scheme-name>
</cache-mapping>
</caching-scheme-mapping>
<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>
<backing-map-scheme>
<!--
Backing map scheme with no eviction policy.
-->
<local-scheme>
<scheme-name>unlimited-backing-map</scheme-name>
</local-scheme>
</backing-map-scheme>
</backing-map-scheme>
<autostart>true</autostart>
</distributed-scheme>
</caching-schemes></cache-config>

1.3.3.3.2 グリッド・キャッシュ構成のエンティティの構成

グリッド・キャッシュを使用するようにエンティティを構成するには、例1-2に示すように@Customizer注釈とGridCacheCustomizerクラスを使用します。このクラスは、内部のTopLink GridキャッシュへのすべてのTopLinkコールをインターセプトし、それらをCoherenceキャッシュにリダイレクトします。

例1-2 グリッド・キャッシュ構成のエンティティの構成

import oracle.eclipselink.coherence.integrated.config.GridCacheCustomizer;
import org.eclipse.persistence.annotations.Customizer;

@Entity
@Customizer(GridCacheCustomizer.class)
public class Employee {
...

1.3.3.3.3 グリッド・キャッシュ構成のオブジェクトの挿入

例1-3では、TopLinkは新しい従業員を作成するために挿入を実行します。エンティティはEntityManagerを通じて永続化され、データベースに配置されます。トランザクションに成功すると、Coherenceキャッシュが更新されます。

例1-3 グリッド・キャッシュ構成のオブジェクトの挿入

EntityManagerFactory emf = Persistence.createEntityManagerFactory("employee-pu");

// Create an employee with an address and telephone number.
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
Employee employee = createEmployee();
em.persist(employee);
em.getTransaction().commit();
em.close();

1.3.3.3.4 グリッド・キャッシュ構成のオブジェクトの問合せ

例1-4では、指定されたJPQL問合せがデータベースに送られます。問合せ結果はCoherenceキャッシュに照らして解決され、以前にキャッシュされたオブジェクトをビルドするコストが回避されます。

例1-4 グリッド・キャッシュ構成のオブジェクトの問合せ

EntityManagerFactory emf = Persistence.createEntityManagerFactory("employee-pu");

EntityManager em = emf.createEntityManager();
List<Employee> employees = em.createQuery("select e from Employee e where e.lastName = :lastName").setParameter("lastName", "Smith").getResultList();

for (Employee employee : employees) {
System.err.println(employee);
for (PhoneNumber phone : employee.getPhoneNumbers()) {
System.err.println("\t" + phone);
}
}

emf.close();

1.3.4 グリッド読取り構成

グリッド読取り構成は、(比較的安定した)大容量のデータに高速にアクセスする必要があり、変更をデータベースに同期的に書き込む必要のあるエンティティに対して使用します。これらのエンティティでは、通常はCoherenceキャッシュへの移入にキャッシュ・ウォーミングが使用されますが、必要に応じて個々の問合せをデータベースに送ることもできます。

一般に、グリッド読取り構成の読取りおよび書込み操作には次の特徴があります。

- 読取り操作では、Coherenceキャッシュからオブジェクトが取得されます。キャッシュ・ローダーの構成は、JPQL問合せに影響しません。次のグリッド読取り構成でのオブジェクトの読取りを参照してください。

- 書込み操作によりデータベースが更新され、コミットが正常に完了すると、更新されたエンティティがCoherenceキャッシュに挿入されます。グリッド読取り構成でのオブジェクトの書込みを参照してください。

詳細な例については、グリッド読取り構成の例を参照してください。

1.3.4.1 グリッド読取り構成でのオブジェクトの読取り

グリッド読取り構成では、すべての主キーおよび非主キー問合せがCoherenceキャッシュに送られます。TopLink Gridでは、問合せの処理時間を短縮するために、データ・グリッド全体での問合せのパラレル処理をサポートしています。Coherenceには、オブジェクト形式のデータがすでに含まれており、データベースとの通信やオブジェクト構築で発生するパフォーマンスへの影響を回避します。

グリッド読取り構成を使用する場合、find(...)メソッドによってリクエストされたエンティティがCoherence内に存在しなければ、nullが返されます。ただし、そのエンティティのキャッシュに対してキャッシュ・ローダーが構成されていれば、Coherenceはデータベースからオブジェクトをロードしようとします。これは、主キー問合せにのみ該当します。

キャッシュ・ローダーを構成しても、Coherenceフィルタに変換されるJPQL問合せに影響を与えることはありません。Coherenceはフィルタを使用して検索する際に、キャッシュ内のエンティティ・セットに対してのみ操作を実行するため、データベースは問合せされません。ただし、次の例に示すように、oracle.eclipselink.coherence.integrated.querying.IgnoreDefaultRedirectorクラスを使用して、問合せごとに問合せをCoherenceではなくデータベースに送ることも可能です。

query.setHint(QueryHints.QUERY_REDIRECTOR, new IgnoreDefaultRedirector());

データベース問合せで取得されたオブジェクトはすべて、以降の問合せで使用できるようCoherenceキャッシュに追加されます。この構成はデフォルトで、Coherenceを介してエンティティに対するすべての問合せを解決するため、Coherenceのキャッシュをすべての問合せ対象のデータでウォーミングする必要があります。

グリッド読取り構成では、単一のエンティティ・タイプからデータを抽出する予測問合せ(レポート)もCoherenceに送られます。たとえば、次のJPQL問合せは、Coherenceキャッシュに含まれるすべての従業員の姓名を返します。

select e.firstName, e.lastName from Employee e

このタイプの問合せは、ユーザー・インタフェースにドロップダウン・リストを移入するときなど、エンティティ全体が必要ではない場合に役立ちます。

EclipseLink JPAはすべてのデータベース更新を実行してから更新されたオブジェクトをCoherenceに伝播するため、キャッシュ・ストアはグリッド読取り構成と互換性がありません。キャッシュ・ストアを使用する場合、Coherenceはオブジェクトの書込みを再試行します。

EclipseLink JPA問合せのヒントの使用に関する完全な情報は、Oracle TopLink Java Persistence API (JPA)拡張リファレンスのJPA問合せカスタマイズの拡張およびOracle TopLinkの理解のJPA問合せのヒントについてを参照してください。

図1-4に、グリッド読取り構成での問合せのパスを示します。

1. アプリケーションがJPQL問合せを発行します。

2. TopLinkはCoherenceキャッシュに対してフィルタを実行します。

3. TopLinkはCoherenceキャッシュからの結果のみを返します。データベースは問合せされません。

図1-4 問合せを使用したオブジェクトの読取り

1.3.4.2 グリッド読取り構成でのオブジェクトの書込み

グリッド読取り構成では、TopLinkがすべてのデータベース書込み操作(挿入、更新、削除)を直接実行します。その後、Coherenceキャッシュがデータベースへの変更を反映するように更新されます。TopLinkには、大量のデータを書き込む際のパフォーマンス機能が数多く用意されています。これらには、バッチ書込み、パラメータ・バインディング、ストアド・プロシージャ・サポート、データベース制約を満たすための文の順序付けなどがあります。

このアプローチは、長所を最大限に生かすことができます。1つはデータベースの更新が効率的に行われること、そしてもう1つはCoherenceのデータ・グリッド全体に対して問合せをパラレルに実行できることで、さらに個々の問合せをデータベースに直接送ることもできます。

図1-5に、グリッド読取り構成でのオブジェクトの書込みと永続化のパスを示します。

1. アプリケーションがcommit問合せを発行します。

2. TopLinkがデータベースを更新します。

3. トランザクションが正常に完了すると、TopLinkはCoherenceキャッシュを更新します。

図1-5 グリッド読取り構成でのオブジェクトの書込みおよび永続化

1.3.4.3 グリッド読取り構成の例

これらの例のコードは、次のURLで入手できます。

http://www.oracle.com/technetwork/middleware/toplink/examples-325517-en-ca.html

1.3.4.3.1 グリッド読取り構成のキャッシュの構成

例1-5のキャッシュ構成ファイル(coherence-cache-config.xml)は、キャッシュを定義し、ラッパー・シリアライザを構成して関係のシリアライズをサポートします。oracle.eclipselink.coherence.integrated.EclipseLinkJPACacheLoaderクラスは、キャッシュ・ストア・スキームを定義します。

例1-5 グリッド読取り構成のキャッシュの構成

<cache-config>
<caching-scheme-mapping>
<cache-mapping>
<cache-name>*</cache-name>
<scheme-name>eclipselink-distributed-readonly</scheme-name>
</cache-mapping>
</caching-scheme-mapping>
<caching-schemes>
<distributed-scheme>
<scheme-name>eclipselink-distributed-readonly</scheme-name>
<service-name>EclipseLinkJPAReadOnly</service-name>
<!--
Configure a wrapper serializer to support serialization of relationships.
-->
<serializer>
<class-name>oracle.eclipselink.coherence.integrated.cache.WrapperSerializer</class-name>
</serializer>
<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>oracle.eclipselink.coherence.integrated.EclipseLinkJPACacheLoader</class-name>
<init-params>
<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-pu</param-value>
</init-param>
</init-params>
</class-scheme>
</cachestore-scheme>
<read-only>true</readonly>
</read-write-backing-map-scheme>
</backing-map-scheme>
<autostart>true</autostart>
</distributed-scheme>
</caching-schemes></cache-config>

1.3.4.3.2 グリッド読取り構成のオブジェクトの読取り

Coherenceキャッシュを読み取るようにエンティティを構成するには、例1-6に示すように@Customizer注釈とCoherenceReadCustomizerクラスを使用します。

例1-6 グリッド読取り構成のエンティティの構成

import oracle.eclipselink.coherence.integrated.config.CoherenceReadCustomizer;
import org.eclipse.persistence.annotations.Customizer;

@Entity
@Customizer(CoherenceReadCustomizer.class)
public class Employee {
...
}

1.3.4.3.3 グリッド読取り構成のオブジェクトの挿入

例1-7では、TopLinkは挿入を実行して新しい従業員を作成しています。トランザクションが正常に完了すると、新しいオブジェクトがその主キーによってCoherenceキャッシュに挿入されます。

例1-7 グリッド読取り構成のオブジェクトの挿入

EntityManagerFactory emf = Persistence.createEntityManagerFactory("employee-pu");
// Create an employee with an address and telephone number
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
Employee employee = createEmployee();
em.persist(employee);
em.getTransaction().commit();
em.close();

emf.close();

1.3.4.3.4 グリッド読取り構成のオブジェクトの問合せ

従業員を検索する際に、読取り問合せがCoherenceキャッシュに送られます。例1-8に示すように、JPQL問合せがCoherenceフィルタに変換されます。

例1-8 グリッド読取り構成のオブジェクトの問合せ

EntityManagerFactory emf = Persistence.createEntityManagerFactory("employee-pu");
EntityManager em = emf.createEntityManager();
List<Employee> employees = em.createQuery("select e from Employee e where e.lastName = :lastName").setParameter("lastName", "Smith").getResultList();
for (Employee employee : employees) {
System.err.println(employee);
for (PhoneNumber phone : employee.getPhoneNumbers()) {
System.err.println("\t" + phone);
}
}emf.close();

特定のID(キー)を使用してCoherenceキャッシュからオブジェクトを取得するには、em.find(Entity.class, ID)メソッドを使用します。指定したIDを持つオブジェクトがキャッシュに存在しない場合は、データベースを問い合せるようCoherenceキャッシュ・ローダーを構成して、オブジェクトを検出することもできます。

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

グリッド・エンティティ構成は、(比較的安定した)大容量のデータに高速にアクセスする必要があり、実行される更新が比較的少ないアプリケーションに対して使用してください。ライトビハインドを使用してこの構成をCoherenceキャッシュ・ストアと組み合せると、データベース更新を非同期に実行することにより、アプリケーションのレスポンス時間を向上させることができます。

一般に、グリッド・エンティティ構成の読取りおよび書込み操作には次の特徴があります。

- 読取り操作では、Coherenceキャッシュからオブジェクトが取得されます。グリッド・エンティティ構成でのオブジェクトの読取りを参照してください。

- 書込み操作により、オブジェクトがCoherenceキャッシュに挿入されます。キャッシュ・ストアが構成されている場合、TopLinkはデータベースに対する書込み操作も実行します。グリッド・エンティティ構成でのオブジェクトの書込みを参照してください。

詳細な例については、グリッド・エンティティ構成の例を参照してください。

1.3.5.1 グリッド・エンティティ構成でのオブジェクトの読取り

グリッド・エンティティ構成でのオブジェクトの問合せは、グリッド読取り構成と同じです。詳細は、グリッド・キャッシュ構成でのオブジェクトの読取りを参照してください。

1.3.5.2 グリッド・エンティティ構成でのオブジェクトの書込み

グリッド・エンティティ構成では、EntityManagerインスタンスを介して永続化、更新またはマージされたオブジェクトはすべて、適切なCoherenceキャッシュに挿入されます。Coherenceキャッシュ内のオブジェクトをデータベースに対して永続化するには、キャッシュごとにEclipseLink JPAキャッシュ・ストア(oracle.eclipselink.coherence.integrated.EclipseLinkJPACacheStore)を構成する必要があります。

ライトビハインドを使用して更新済のオブジェクトの一括書込みを非同期的に行うよう、キャッシュ・ストアを構成することもできます。詳細は、『Oracle Coherenceでのアプリケーションの開発』を参照してください。

図1-6に、グリッド・エンティティ構成でのオブジェクトの書込みと永続化のパスを示します。

1. アプリケーションがcommitコールを発行します。

2. TopLinkはすべての問合せを送って、Coherenceキャッシュを更新します。

3. Coherenceのキャッシュ・ストアを構成すると(オプション)、TopLinkはデータベースも更新します。

図1-6 グリッド・エンティティ構成でのオブジェクトの書込みおよび永続化

1.3.5.3 グリッド・エンティティ構成でのオブジェクトの書込みに対する制約

キャッシュ・ストアを使用する場合、Coherenceはすべての書込み操作が成功することを前提とするため、TopLinkに失敗を通知しません。このため、Coherenceキャッシュがデータベースの内容と異なることがあります。Coherenceとサード・パーティ製アプリケーションによってデータベースが同時に更新された場合に発生する可能性のあるデータの破損から保護するためにオプティミスティック・ロックを使用することはできません。

Coherenceキャッシュ・メンバーがデータベースに更新を書き込む順序は予測できないため、参照整合性は保証できません。参照整合性制約はデータベースから削除する必要があります。そうしないと、書込み操作が次のエラーで失敗することがあります。

org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.BatchUpdateException: ORA-02292: integrity constraint violated - child record found
Error Code: 2292

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

これらの例のコードは、次のURLで入手できます。

http://www.oracle.com/technetwork/middleware/toplink/examples-325517-en-ca.html

1.3.5.4.1 グリッド・エンティティ構成のキャッシュの構成

例1-9のキャッシュ構成ファイル(coherence-cache-config.xml)は、ラッパー・シリアライザを構成して関係のシリアライズをサポートします。oracle.eclipselink.coherence.integrated.EclipseLinkJPACacheStoreクラスは、キャッシュ・ストア・スキームを定義します。

例1-9 グリッド・エンティティ構成のキャッシュの構成

<cache-config>
<caching-scheme-mapping>
<cache-mapping>
<cache-name>*</cache-name>
<scheme-name>eclipselink-distributed-readwrite</scheme-name>
</cache-mapping>
</caching-scheme-mapping>
<caching-schemes>
<distributed-scheme>
<scheme-name>eclipselink-distributed-readwrite</scheme-name>
<service-name>EclipseLinkJPAReadWrite</service-name>
<!--
Configure a wrapper serializer to support serialization of relationships.
-->
<serializer>
<class-name>oracle.eclipselink.coherence.integrated.cache.WrapperSerializer</class-name>
</serializer>
<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>oracle.eclipselink.coherence.integrated.EclipseLinkJPACacheStore</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-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>

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

Coherenceを読み取るようにエンティティを構成するには、例1-10に示すように@Customizer注釈とCoherenceReadWriteCustomizerクラスを使用します。

例1-10 グリッド・エンティティ構成のエンティティの構成

import oracle.eclipselink.coherence.integrated.config.CoherenceReadWriteCustomizer;
import org.eclipse.persistence.annotations.Customizer;

@Entity
@Customizer(CoherenceReadWriteCustomizer.class)
public class Employee {
...
}

1.3.5.4.3 グリッド・エンティティ構成のオブジェクトの永続化

例1-11では、TopLinkは新しい従業員を作成するために挿入を実行します。エンティティはEntityManagerインスタンスによって永続化され、適切なCoherenceキャッシュに挿入されます。

例1-11 グリッド・エンティティ構成のオブジェクトの永続化

EntityManagerFactory emf = Persistence.createEntityManagerFactory("employee-pu");

// Create an employee with an address and telephone number.
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
Employee employee = createEmployee();
em.persist(employee);
em.getTransaction().commit();
em.close();

1.3.5.4.4 グリッド・エンティティ構成のオブジェクトの問合せ

例1-12に示すように、従業員を検索する際に、読取り問合せがCoherenceキャッシュに送られます。

例1-12 グリッド・エンティティ構成のオブジェクトの問合せ

EntityManagerFactory emf = Persistence.createEntityManagerFactory("employee-pu");

EntityManager em = emf.createEntityManager();
List<Employee> employees = em.createQuery("select e from Employee e where e.lastName = :lastName").setParameter("lastName", "Smith").getResultList();

for (Employee employee : employees) {
System.err.println(employee);
for (PhoneNumber phone : employee.getPhoneNumbers()) {
System.err.println("\t" + phone);
}
}

emf.close();

特定のID(キー)を使用してCoherenceキャッシュからオブジェクトを取得するには、em.find(Entity.class, ID)メソッドを使用します。指定したIDを持つオブジェクトがキャッシュに存在しない場合は、データベースを問い合せるようCoherenceキャッシュ・ストアを構成して、オブジェクトを検出することもできます。

1.3.6 グリッド読取りおよびグリッド・エンティティのフェイルオーバーの処理

グリッド読取り構成とグリッド・エンティティ構成では、TopLink GridはJPQL問合せからCoherenceフィルタへの変換とグリッドでの問合せの実行を試行します。ただし、一部の問合せはフィルタに変換できません。TopLink Gridは、このような問合せを検出すると、データベースに自動的にフェイルオーバーして問合せを実行します。TopLinkでは、JPQLからフィルタへの変換に失敗した場合に呼び出されるユーザー定義の変換失敗委任オブジェクトを指定できます。変換失敗委任は、eclipselink.coherence.query.translation-failure-delegate永続性ユニット・プロパティを宣言することで構成します。次に例を示します。

<property name="eclipselink.coherence.query.translation-failure-delegate" value="org.example.ExceptionFailoverPolicy"/>

変換失敗委任では、translationFailed(DatabaseQuery query, Record arguments, Session session)という単一のメソッドを定義するoracle.eclipselink.coherence.integrated.querying.TranslationFailureDelegateクラスを実装する必要があります。

1.3.7 エンティティ・リレーションシップのラップとアンラップ

リレーションシップとともにエンティティをCoherenceキャッシュに格納するとき、TopLink Gridは、リレーションシップ情報を維持するラッパー・クラスを生成します。この方法で、オブジェクトが(eagerまたはlazyで)Coherenceキャッシュから読み取られるときにリレーションシップを解決できます。

Coherence APIを使用してエンティティをCoherenceキャッシュから直接読み取ると、ラッパーは自動的には削除されません。例1-13に示すように、シリアライザでsetNotEclipseLink(true)メソッドを呼び出すことによりプログラムで自動アンラップを構成できます。また、システム・プロパティをeclipselink.coherence.not-eclipselinkとして設定して、エンティティを自動的にアンラップすることもできます。

正しく構成されると、キャッシュget操作はアンラップされたエンティティを返します。

例1-13 エンティティのアンラップ

WrapperSerializer wrapperSerializer = (WrapperSerializer)myCache.getCacheService().getSerializer();
wrapperSerializer.setNotEclipseLink(true); // So the Serializer will unwrap an Entity when clients use a get() call from the cache.

1.3.8 問合せの操作

この項では、次のトピックについて説明します。

- IDによるオブジェクトの問合せ

- 基準を使用したオブジェクトの問合せ

- 問合せでの索引の使用

- 問合せに対する制約

1.3.8.1 IDによるオブジェクトの問合せ

特定のID(キー)を使用してCoherenceキャッシュからエンティティを取得するには、em.find(Entity.class, ID)メソッドを使用します。たとえば、次のコードはキー8のエンティティをCoherence Employeeキャッシュから取得します。

em.find(Employee.class, 8)

エンティティがCoherenceキャッシュ内に見つからない場合、TopLinkはデータベースに対してSELECT文を実行します。結果が見つかると、エンティティが構成されてCoherenceに挿入されます。問合せ固有の動作は、Coherenceキャッシュ構成によって決まります。

- グリッド・キャッシュ構成でfindメソッドを呼び出すと、キャッシュ・ミス時にデータベースに対してSELECT文が実行され、キャッシュが更新されます。

- グリッド読取り構成またはグリッド・エンティティ構成でfindメソッドを呼び出すと、Coherenceキャッシュに対してget操作が実行されます。キャッシュ・ミスの場合は、CacheLoaderインスタンス(構成されている場合)を使用してデータベースに対してSELECT文が実行されます。

1.3.8.2 基準を使用したオブジェクトの問合せ

特定の選択基準と一致するエンティティを取得するには、em.createQuery("...")メソッドを使用します。問合せ固有の動作は、Coherenceキャッシュ構成によって決まります。

- グリッド・キャッシュ構成では、問合せは常にデータベースに対してSELECT文を実行します。たとえば、次のコードはSELECT文を実行してJohnという名前の従業員を検索します。

em.createQuery("select e from Employee e where e.name='John'")

- グリッド読取り構成とグリッド・エンティティ構成では、問合せはCoherenceキャッシュに対して実行されます。キャッシュに選択基準と一致するエンティティが存在しない場合は、何も返されません。これは、問合せを実行する前にキャッシュをウォーミングする必要のある理由の一例です。

- キャッシュ・ストアとキャッシュ・ローダーでは、問合せは主キーに対してのみ実行されます。

1.3.8.3 問合せでの索引の使用

索引を使用すると、値(またはそれらの値の属性)および対応するキーをキャッシュ内で関連付けて、問合せのパフォーマンスを向上させることができます。TopLink Gridでは、@Property注釈で索引を宣言できます。IntegrationPropertiesクラスはINDEXEDプロパティを提供します。

例1-14の@Property注釈は、name属性が索引付けされることを宣言しています。TopLink Gridは、Publisherキャッシュ内のその属性の索引を定義します。

例1-14 TopLink GridへのCoherence問合せ索引の公開

import static oracle.eclipselink.coherence.IntegrationProperties.INDEXED;
import oracle.eclipselink.coherence.integrated.config.CoherenceReadCustomizer;

@Customizer(CoherenceReadCustomizer.class)
public class Publisher implements Serializable {
...
@Property(name=INDEXED, value="true")
private String name;
...

索引が付けられたら、次のようなJPQL問合せを発行して、キャッシュ内の名前がSで始まるすべてのPublishersを返すことができます。

SELECT Publisher p WHERE p.name like 'S%'

内部的には、Coherenceはグリッドに格納されているすべてのPublisherオブジェクトをデシリアライズして検証するかわりにname索引を調べて一致を探すことで問合せを処理します。デシリアライズを回避することで、問合せの実行時間が大幅に向上し、一時的にデシリアライズされたオブジェクトのガベージ・コレクションが不要になり、CPU使用量が削減されます。

1.3.8.4 問合せに対する制約

Coherenceキャッシュの問合せには次の制約があります。

- Coherenceのフィルタ・フレームワークは単一キャッシュに制限されているため、JPQLのjoin問合せをフィルタに変換することはできません。すべてのjoin問合せはデータベースに対して実行されます。

- このリリースのTopLink Gridでは、JPQLバルク更新および削除をサポートしていません。

1.4 EclipseLink Native ORMの構成

この項では、広範なオブジェクト・リレーショナル・マッピング・フレームワークであるEclipseLink Native Object Relational Mapping (ORM)について説明します。また、Oracle JDeveloperを使用した修正メソッドの構成方法と、EclipseLink Native ORMキャッシュ・ストアおよびキャッシュ・ローダーの構成方法についても説明します。

この項は、次のトピックで構成されています。

- EclipseLink Native ORMの理解

- EclipseLink Native ORMのAPI

- 修正メソッドの構成

- EclipseLink Native ORMキャッシュ・ストアおよびキャッシュ・ローダーの構成

1.4.1 EclipseLink Native ORMの理解

EclipseLink Native ORMは、広範なオブジェクト・リレーショナル・マッピング・フレームワークを提供します。XMLを使用して宣言により構成される様々な機能とともに、高パフォーマンスのオブジェクト永続化を提供します。これらの様々な機能には、キャッシング(クラスタ化されたキャッシングを含む)、高度なデータベース固有機能、およびパフォーマンス・チューニングと管理のオプションが含まれます。

グリッド基盤のJPA構成と同様に、EclipseLink ORMを採用するアプリケーションはCoherenceキャッシュにアクセスできます。ただし、グリッド基盤のJPA構成とは異なり、EclipseLink ORMアプリケーションはキャッシュの使用方法を構成するために@Customizer注釈を使用しません。かわりに、通常は適切なキャッシュ動作を定義する修正メソッドを呼び出します。

1.4.2 EclipseLink Native ORMのAPI

EclipseLink Native ORMで使用されるキャッシュ・ストアおよびキャッシュ・ローダーAPIは、toplink-grid.jarファイルに含まれています。表1-2で、EclipseLink Native ORMのAPIについて説明します。これらのクラスはoracle.eclipselink.coherence.integratedパッケージにあります。

表1-2 Native ORM構成用のEclipseLinkクラス

クラス名

説明

EclipseLinkNativeCacheStore(String cacheName, String sessionName)

ネイティブEclipseLink構成で使用する必要のあるCoherenceキャッシュ・ストア(sessions.xml)。

EclipseLinkNativeCacheLoader(String cacheName, String sessionName)

ネイティブEclipseLink構成で使用する必要のあるCoherenceキャッシュ・ローダー(sessions.xml)。

oracle.eclipselink.coherence.integrated.config.CoherenceReadCustomizer

Coherence読取り構成を有効にします。

oracle.eclipselink.coherence.integrated.config.CoherenceReadWriteCustomizer

Coherence読取り/書込み構成を有効にします。

oracle.eclipselink.coherence.integrated.config.GridCacheCustomizer

エンティティ・インスタンスを内部EclipseLink共有キャッシュのかわりにCoherenceにキャッシュできるようにします。

署名の2つ目の初期化パラメータsessionNameは、EclipseLink構成ファイルMETA-INF/sessions.xmlにリストされている必要のあるマッピング・プロジェクトの名前を表します。

EclipseLinkNativeCacheStoreクラスとEclipseLinkNativeCacheLoaderクラスでは、EclipseLink Native ORMを使用するアプリケーションがCoherenceキャッシュにアクセスできます。これらのクラスは、Coherenceキャッシュの動作が修正メソッドで構成されている場合に使用します。これらのクラスを使用して、グリッド基盤のJPA構成の説明と同じ方法で各永続クラスのキャッシュ・ストアまたはキャッシュ・ローダーを構成できます。

Coherenceキャッシュ構成ファイルcoherence-cache-config.xmlを使用して、キャッシュ・ストア・キャッシュ・スキームを定義し、デフォルトのCoherence設定をオーバーライドします。

構成では、ネイティブEclipseLink sessions.xmlファイルとproject.xmlファイルを使用します。sessions.xmlファイル、およびそこにリストされているすべてのデプロイメントXMLファイル(ユーザー定義の名前を持ちます)は、クラスパスで使用可能になっているか、META-INFディレクトリ内のJARファイルにパッケージ化されている必要があります。

適切なキャッシュ動作を定義するには、修正メソッドも構成する必要があります。詳細は、修正メソッドの構成を参照してください。

1.4.3 修正メソッドの構成

修正メソッドとは、EclipseLink記述子APIを使用してクラスに対するORMマッピング・メタデータをカスタマイズするメソッドです。メソッドは実行時に記述子がロードされる際にコールされます。TopLink Gridにより提供される修正メソッドの目的は、Coherenceキャッシュの使用方法を定義することです。修正メソッドは、TopLink Native ORMで@Customizer注釈にかわるものです。どちらの場合も同じ構成が生成されます。

toplink-grid.jarにあるTopLink Gridのカスタマイザ・クラス(CoherenceReadCustomizer、CoherenceReadWriteCustomizer、およびGridCacheCustomizer)は、適切なCoherenceキャッシュ動作を有効にするために選択できるafterLoad修正メソッドを提供します。

JDeveloperまたはEclipseLink Workbenchを使用して修正メソッドを選択できます。次の項では、JDeveloperで修正メソッドを構成する方法について説明します。EclipseLink Workbenchの説明は、このドキュメントでは述べません。

1.4.3.1 JDeveloperでの修正メソッドの構成

修正メソッドを構成するには、次の手順に従います。

1. JDeveloperの「構造」ペインで、目的のtlMap記述子名を展開します。

図1-7 JDeveloperの「構造」ペインのtlMap記述子

2. 目的のTopLink記述子要素を右クリックします。「アドバンスト・プロパティ」を選択して「アドバンスト・プロパティ」ダイアログ・ボックスを開きます。「ロード後」チェック・ボックスを選択し、「OK」をクリックします。

図1-8 「アドバンスト・プロパティ」ダイアログ・ボックス

3. tlMap構成ウィンドウの「ロード後」タブで、選択したTopLink記述子に使用するafterLoad修正メソッドを含むクラスの名前を入力します。クラス・ブラウザを使用してクラスを検索することもできます。図1-9に、tlMap構成ウィンドウの「ロード後」タブを示します。

図1-9 TopLink記述子の「ロード後」タブ

図1-10に、CoherenceReadCustomizerクラスが選択されているクラス・ブラウザを示します。

図1-10 修正メソッドを含むクラスの検索

4. tlMap構成ウィンドウの「ロード後」タブで、「Staticメソッド」ドロップダウン・リストから修正メソッドを選択します。Coherence Customizerクラスの場合、これはafterLoadメソッドになります。

図1-11 修正メソッドの選択

1.4.4 EclipseLink Native ORMキャッシュ・ストアおよびキャッシュ・ローダーの構成

coherence-cache-config.xmlファイルでは、キャッシュ・ローダーまたはキャッシュ・ストア・クラスを指定し、キャッシュ名とセッション名(つまりプロジェクト名)のパラメータを提供する必要があります。次の例は、クラス名(EclipseLinkNativeCacheStoreまたはEclipseLinkNativeCacheLoader)の変更以外に、キャッシュ・ローダーまたはキャッシュ・ストアを使用しているかどうかに応じてCoherenceキャッシュ構成に対して変更を行わないことを示しています。

例1-15は、EclipseLink Native ORMアプリケーションと通信できるキャッシュのcoherence-cache-config.xmlファイル内の構成を示しています。class-name要素は、EclipseLinkNativeCacheStoreクラスをキャッシュ・ストア・スキームとして識別します。param-value要素は、クラスに渡されるキャッシュ名とセッション(プロジェクト)名を指定します。

例1-15 統合EclipseLinkNativeCacheStoreの構成

...
<distributed-scheme>
<scheme-name>eclipselink-native-distributed-store</scheme-name>
<service-name>EclipseLinkNative</service-name>
<serializer>
<class-name>oracle.eclipselink.coherence.integrated.cache.WrapperSerializer</class-name>
</serializer>
<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>oracle.eclipselink.coherence.integrated.EclipseLinkNativeCacheStore</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>coherence-native-project</param-value>
</init-param>
</init-params>
</class-scheme>
</cachestore-scheme>
</read-write-backing-map-scheme>
</backing-map-scheme>
<autostart>true</autostart>
</distributed-scheme>
...

例1-16は、coherence-cache-config.xmlファイル内の統合EclipseLinkNativeCacheLoaderインスタンス構成を示しています。キャッシュ名({cache-name})およびセッション名(coherence-native-project)パラメータ値がクラスに渡されます。

例1-16 統合EclipseLinkNativeCacheLoaderの構成

...
<cachestore-scheme>
<class-scheme>
<class-name>oracle.eclipselink.coherence.integrated.EclipseLinkNativeCacheLoader</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>coherence-native-project</param-value>
</init-param>
</init-params>
</class-scheme>
</cachestore-scheme>
...

1.5 TopLink GridおよびCoherenceでのPOFシリアライズの使用

この項では、Portable Object Format (POF)シリアライズを使用して、TopLink GridおよびCoherenceキャッシュを使用するアプリケーションのパフォーマンスを最適化する方法について説明します。

シリアライズとは、オブジェクトをバイナリ形式にエンコードするプロセスです。これは、ネットワークを介してデータを移動する必要がある場合のCoherenceの操作に不可欠な機能です。Portable Object Format (POF)は言語に依存しないバイナリ形式です。POFは領域と時間の両面で効率を向上させるように設計されており、Coherenceの使用時に不可欠なものとなっています。POFの使用には、パフォーマンス上のメリットから言語の非依存性まで、様々なメリットがあります。Coherenceで作業する際には、シリアライズ・ソリューションとしてPOFを詳細に検討することをお薦めします。

この項では、POFシリアライズの対象とするためにTopLinkアプリケーション・ファイルに加える必要がある変更および追加についてのみ説明します。POFの使用方法および構成の詳細は、『Oracle Coherenceでのアプリケーションの開発』のPortable Object Formatの使用方法に関する項を参照してください。

この項は、次のトピックで構成されています。

- シリアライズ・ルーチンの実装

- キャッシュ構成ファイルの定義

- POF構成ファイルの定義

1.5.1 シリアライズ・ルーチンの実装

エンティティのシリアライズおよびデシリアライズの方法を指定するシリアライズ・ルーチンを実装する必要があります。これは、PortableObjectインタフェースを実装するか、com.tangosol.io.pof.PofSerializerインタフェースを使用してシリアライザを作成することで実行できます。

- エンティティ・クラス・ファイルでのPortableObjectインタフェースの実装
com.tangosol.io.pof.PortableObjectインタフェースは、POFデータ・ストリームとの間で自身の状態を自己シリアライズおよびデシリアライズする機能を持つクラスを提供します。このインタフェースを使用するには、必須メソッドreadExternalおよびwriteExternalも実装する必要があります。

例1-17は、PortableObjectインタフェースを実装するエンティティ・クラス・ファイルの例を示しています。必須メソッドのreadExternalおよびwriteExternalも実装されていることに注目してください。

このクラスには、TradeオブジェクトとSecurityオブジェクトとのリレーションシップ・マッピングを定義する@OneToOne注釈が含まれていることにも注意してください。TopLinkでは、JPA仕様によって定義されているリレーションシップ・マッピング(1対1、1対多、多対多および多対多)がすべてサポートされています。これらのリレーションシップは、注釈として表すことができます。

例1-17 PortableObjectを実装するエンティティ・クラスの例

package oracle.toplinkgrid.codesample.pof.models.trader;

import java.io.IOException;
import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;

import com.tangosol.io.pof.PofReader;
import com.tangosol.io.pof.PofWriter;
import com.tangosol.io.pof.PortableObject;

/**
* This class will not be stored within Coherence as Trades are not high
* throughput objects in this model.
*
*/
@Entity
public class Trade implements Serializable, PortableObject{
/**
*
*/
private static final long serialVersionUID = -244532585419336780L;
@Id
@GeneratedValue
protected long id;
@OneToOne(fetch=FetchType.EAGER)
protected Security security;
protected int quantity;
protected double amount;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public Security getSecurity() {
return security;
}
public void setSecurity(Security security) {
this.security = security;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
public double getAmount() {
return amount;
}
public void setAmount(double amount) {
this.amount = amount;
}
public void readExternal(PofReader pofreader) throws IOException {
id = pofreader.readLong(0);
quantity = pofreader.readInt(2);
amount = pofreader.readDouble(3);

}
public void writeExternal(PofWriter pofwriter) throws IOException {
pofwriter.writeLong(0, id);
pofwriter.writeInt(2, quantity);
pofwriter.writeDouble(3, amount);

}
}

- エンティティに対するPOFSerializerの作成
PortableObjectインタフェースを実装するかわりに、com.tangosol.io.pof.PofSerializerインタフェースを実装して独自のシリアライザおよびデシリアライザを作成できます。このインタフェースには、シリアライズ・ロジックを、シリアライズするエンティティから外部化する手段が用意されています。これは、CoherenceでPOFを使用する場合に、クラスの構造を変更したくないときには特に役立ちます。POFSerializerインタフェースは、次のメソッドを提供します。

- public Object deserialize(PofReader in)

- public void serialize(PofWriter out, Object o)

1.5.2 キャッシュ構成ファイルの定義

キャッシュ構成ファイルで、操作するエンティティに対応するキャッシュ・マッピングを作成します。シリアライザ(com.tangosol.io.pof.ConfigurablePofContextなど)およびPOF構成ファイルpof-config.xmlを指定します。EclipseLinkキャッシュ・ストア(oracle.eclipselink.coherence.integrated.EclipseLinkJPACacheStoreなど)を<cachestore-scheme>属性内に指定します。

例1-18 キャッシュ構成ファイルの例

<?xml version="1.0"?>
<cache-config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.oracle.com/coherence/coherence-cache-config"
xsi:schemaLocation="http://xmlns.oracle.com/coherence/coherence-cache-config http://xmlns.oracle.com/coherence/coherence-cache-config/1.0/coherence-cache-config.xsd">
<caching-scheme-mapping>
<cache-mapping>
<cache-name>ATTORNEY_JPA_CACHE</cache-name>
<scheme-name>eclipselink-jpa-distributed</scheme-name>
</cache-mapping>
<cache-mapping>
<cache-name>CONTACT_JPA_CACHE</cache-name>
<scheme-name>eclipselink-jpa-distributed-load</scheme-name>
</cache-mapping>
...
additional cache mappings
...
<caching-schemes>
<distributed-scheme>
<scheme-name>eclipselink-jpa-distributed-load</scheme-name>
<service-name>EclipseLinkJPA</service-name>

<serializer>
<instance>
<class-name>com.tangosol.io.pof.ConfigurablePofContext</class-name>
<init-params>
<init-param>
<param-type>String</param-type>
<param-value>trader-pof-config.xml</param-value>
</init-param>
</init-params>
</instance>
</serializer>
<backing-map-scheme>
<read-write-backing-map-scheme>
<internal-cache-scheme>
<local-scheme/>
</internal-cache-scheme>
</read-write-backing-map-scheme>
</backing-map-scheme>
<autostart>true</autostart>
</distributed-scheme>
<distributed-scheme>
<scheme-name>eclipselink-jpa-distributed</scheme-name>
<service-name>EclipseLinkJPA</service-name>
<serializer>
<instance>
<class-name>com.tangosol.io.pof.ConfigurablePofContext</class-name>
<init-params>
<init-param>
<param-type>String</param-type>
<param-value>trader-pof-config.xml</param-value>
</init-param>
</init-params>
</instance>
</serializer>

<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>oracle.eclipselink.coherence.integrated.EclipseLinkJPACacheStore</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>coherence-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>

1.5.3 POF構成ファイルの定義

POFシリアライズの対象とするエンティティ・クラスを指定するファイルを定義します。Coherenceにはデフォルトで、pof-config.xmlという名前のPOF構成ファイルが用意されています。このファイルを使用して、TopLinkクラスのtype-idsをエンティティ・クラスに割り当てます。

TopLink GridによりTopLink-Grid必須クラスへのtype-idの割当が簡単になります。POF構成ファイルでallow-interfaces要素がtrueに設定されている場合、複数のTopLink-Gridクラスに対して必要なtype-idエントリは1つのみです。

- oracle.eclipselink.coherence.integrated.cache.TopLinkGridPortableObject - PortableObjectインタフェースのTopLink Gridアナログ。TopLinkGridPortableObjectインタフェースを実装するTopLink Gridは、TopLinkGridSerializerクラスでシリアライズされたPOFになります。これにより、allow-interfaces POF構成要素がtrueに設定されている場合は、このインタフェースのすべてのインプリメンタに対して単一のクラスを登録できます。

- oracle.eclipselink.coherence.integrated.cache.TopLinkGridSerializer - TopLinkGridPortableObjectインタフェースのすべてのインプリメンタに関連付けられたシリアライザ。これにより、allow-interfaces POF構成要素がtrueに設定されている場合は、このインタフェースのすべてのインプリメンタに対して単一のクラスをPOF構成XMLファイルに登録できます。

例1-19は、AttorneyエンティティへのTopLinkGridPortableObjectおよびTopLinkGridSerializerシリアライザ・クラスの割当てを示しています。

例1-19 簡略化したPOF構成ファイル

<?xml version="1.0"?>
<pof-config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.oracle.com/coherence/coherence-pof-config"
xsi:schemaLocation="http://xmlns.oracle.com/coherence/coherence-pof-config http://xmlns.oracle.com/coherence/coherence-pof-config/1.0/coherence-pof-config.xsd">
<user-type-list>
<!-- include all "standard" Coherence POF user types -->
<include>coherence-pof-config.xml</include>
<user-type>
<type-id>1163</type-id>
<class-name>oracle.toplinkgrid.codesample.pof.models.trader.Attorney</class-name>
</user-type>
...
additional type IDs for Entity classes
...
<user-type>
<type-id>1130</type-id>

<class-name>oracle.eclipselink.coherence.integrated.cache.TopLinkGridPortableO bject</class-name>
<serializer>

<class-name>oracle.eclipselink.coherence.integrated.cache.TopLinkGridSerialize r</class-name>
</serializer>
</user-type>
...

<allow-interfaces>true</allow-interfaces>
</pof-config>

注意:

TopLink Grid POF構成には、allow-subclasses要素は必須ではありません。

allow-interfacesをtrueに設定できない場合は、次のクラスに対して個別にtype-idエントリを定義する必要があります。

- oracle.eclipselink.coherence.integrated.internal.cache.ElementCollectionUpdateProcessor: キャッシュ内のElementCollectionオブジェクトを更新する際にTopLink Gridで使用されるエントリ・プロセッサ。

- oracle.eclipselink.coherence.integrated.internal.cache.RelationshipUpdateProcessor: グリッドに遅延ロードされた関連データを更新するために使用される内部ファイル。

- oracle.eclipselink.coherence.integrated.internal.cache.VersionPutProcessor: グリッドに対するオプティミスティック・ロック対応の更新に使用される内部ファイル。

- oracle.eclipselink.coherence.integrated.internal.cache.VersionRemoveProcessor: グリッドからのオプティミスティック・ロック対応の削除に使用される内部ファイル。

- oracle.eclipselink.coherence.integrated.internal.cache.SerializableWrapper: 非POFシリアライズ用の汎用ラッパー・クラス。これは、適切な動的ラッパーが定義されていないために例外を生成する可能性があるノードをシリアライズするために提供されます。

- oracle.eclipselink.coherence.integrated.internal.cache.LockVersionExtractor: オプティミスティック・ロックされたオブジェクトのconditional put中に使用されます。このクラスは、オブジェクトからバージョン値を抽出するために使用されます。

- oracle.eclipselink.coherence.integrated.internal.querying.FilterExtractor: キャッシュに格納されているオブジェクトから値を抽出するためにフィルタによって使用されます。これは、属性アクセスとメソッド・アクセスの両方をサポートしています。

- oracle.eclipselink.coherence.integrated.internal.querying.EclipseLinkFilterFactory$SubClassOf: 内部クラス。これは、エンティティ・タイプに基づいてフィルタするFilter拡張です。多相問合せからスーパークラスを取り除きます。type-idは、この操作を使用している場合にのみ、このクラスに対して必要です。

- oracle.eclipselink.coherence.integrated.internal.querying.EclipseLinkFilterFactory$$IsNull: 内部クラス。IsNullは、明示的なメソッド名のかわりにValueExtractorのサポートが提供されること以外は、CoherenceのIsNullFilterと同等です。type-idは、この操作を使用している場合にのみ、このクラスに対して必要です。

- oracle.eclipselink.coherence.integrated.internal.querying.EclipseLinkFilterFactory$$IsNotNull: 内部クラス。IsNotNullは、明示的なメソッド名のかわりにValueExtractorのサポートが提供されること以外は、CoherenceのIsNotNullFilterと同等です。type-idは、この操作を使用している場合にのみ、このクラスに対して必要です。

- oracle.eclipselink.coherence.integrated.internal.cache.WrapperInternal: このインタフェースは、エンティティ・ラッパーの内部属性にアクセスするために使用されます。
oracle.eclipselink.coherence.integrated.cache.WrapperPofSerializer: 関連付けられたシリアライザ。このクラスは、Coherenceキャッシュに直接アクセスする場合に、Coherence内でエンティティ・ラッパーに対するシリアライズ・サポートを提供するために使用されます。これには、カスタム値エクストラクタを持つユーザーが含まれます。

- oracle.eclipselink.coherence.integrated.internal.querying.EclipseLinkExtractor: このインタフェースはCoherence POFシリアライズで、EclipseLinkエクストラクタをシリアライズ用にマークするために使用されます。フィルタに対するTopLink Gridエンティティから値を抽出します。
oracle.eclipselink.coherence.integrated.cache.ExtractorSerializer: 関連付けられたシリアライザ。このクラスは、Coherenceキャッシュに直接アクセスする場合に、Coherence内でエンティティ・ラッパーに対するシリアライズ・サポートを提供するために使用されます。これには、カスタム値エクストラクタを持つユーザーが含まれます。

例1-20は、TopLink Gridサポート・ファイルの定義を含むPOF構成ファイルの例を示しています。

例1-20 TopLinkクラスの定義を含むPOF構成ファイルの例

...
additional type IDs for Entity classes
...
<user-type>
<type-id>1144</type-id>
<class-name>oracle.eclipselink.coherence.integrated.internal.cache.ElementCollectionUpdateProcessor</class-name>
</user-type>
<user-type>
<type-id>1143</type-id>
<class-name>oracle.eclipselink.coherence.integrated.internal.querying.FilterExtractor</class-name>
</user-type>
<user-type>
<type-id>1142</type-id>
<class-name>oracle.eclipselink.coherence.integrated.internal.cache.LockVersionExtractor</class-name>
</user-type>
<user-type>
<type-id>1141</type-id>
<class-name>oracle.eclipselink.coherence.integrated.internal.cache.VersionPutProcessor</class-name>
</user-type>
<user-type>
<type-id>1140</type-id>
<class-name>oracle.eclipselink.coherence.integrated.internal.cache.VersionRemoveProcessor</class-name>
</user-type>
<user-type>
<type-id>1139</type-id>
<class-name>oracle.eclipselink.coherence.integrated.internal.cache.RelationshipUpdateProcessor</class-name>
</user-type>
<user-type>
<type-id>1138</type-id>
<class-name>oracle.eclipselink.coherence.integrated.internal.cache.SerializableWrapper</class-name>
</user-type>
<user-type>
<type-id>1137</type-id>
<class-name>oracle.eclipselink.coherence.integrated.internal.querying.EclipseLinkFilterFactory$SubClassOf</class-name>
</user-type>
<user-type>
<type-id>1136</type-id>
<class-name>oracle.eclipselink.coherence.integrated.internal.querying.EclipseLinkFilterFactory$$IsNull</class-name>
</user-type>
<user-type>
<type-id>1135</type-id>
<class-name>oracle.eclipselink.coherence.integrated.internal.querying.EclipseLinkFilterFactory$$IsNotNull</class-name>
</user-type>
</user-type-list>

<allow-interfaces>false</allow-interfaces>
</pof-config>

1.6 ベスト・プラクティス

この項では、バイト・コード・ウィービング、遅延ロード、ニア・キャッシュ、およびキャッシュ構成でのTopLink Gridの使用方法に関するベスト・プラクティスの推奨事項について説明します。

この項は、次のトピックで構成されています。

- バイト・コード・ウィービングでのコンパイル済Javaクラスの変更

- 遅延ロードでのデータベース問合せの遅延

- TopLink Gridを使用するアプリケーションに対するニア・キャッシュの定義

- キャッシュ構成において接頭辞付きのキャッシュ名でワイルドカードが使用されるようにする

- デフォルト・キャッシュ名のオーバーライド

1.6.1 バイト・コード・ウィービングでのコンパイル済Javaクラスの変更

バイト・コード・ウィービングは、コンパイル済Javaクラスのバイト・コードを変更する手法です。バイト・コード・ウィービングを構成して、1対1および多対1関係の遅延ロードのサポート、属性レベルの変更追跡、フェッチ・グループなど、いくつかのEclipseLink JPAパフォーマンス最適化を有効にできます。

ウィービングは、エンティティ・クラスのロード時に動的に実行するか、ビルド・プロセスの一部として静的に実行できます。静的バイト・コード・ウィービングは、EclipseLinkで提供されるweaverタスクを使用してAntビルドに組み込むことができます。

動的バイト・コード・ウィービングは、Oracle WebLogicなどのJava EE 5対応アプリケーション・サーバーで自動的に有効になります。ただし、Java SEでは、JRE 1.5 javaagent JVMコマンド行引数を使用して明示的に有効にする必要があります。Oracle TopLinkソリューション・ガイドのウィービングの使用に関する項を参照してください。

Coherenceキャッシュ・サーバーでバイト・コード・ウィービングを有効にするには、-javaagent:<PATH>\eclipselink.jarでJava VMを起動する必要があります。Java SEクライアント・アプリケーションは、-javaagent引数を指定して実行する必要があります。

静的および動的バイト・コード・ウィービングの構成と無効化の詳細は、Oracle TopLinkソリューション・ガイドのウィービングの使用に関する項を参照してください。

1.6.2 遅延ロードでのデータベース問合せの遅延

遅延ロードは、必要になるまでデータベースへのオブジェクトの問合せを遅延するために使用する手法です。これにより、アプリケーションによってロードされるデータ量を削減し、スループットを向上できます。TopLink Grid JPAまたはネイティブORMアプリケーションでは、すべての関係を遅延ロードする必要があります。JPAの1対多および多対多関係では遅延ロードがデフォルトですが、1対1および多対1関係では即時です。これらの関係タイプでは、遅延ロードを明示的に選択する必要があります。たとえば、関係注釈の多くでは遅延ロードを属性として指定できます。

...
@ManyToOne(fetch=FetchType.LAZY)
private Publisher parent
...

効率を最大化するために、TopLink GridがCoherenceキャッシュに格納するすべての1対1および多対1エンティティ関係に遅延ロードを指定する必要があります。遅延ロードは、EclipseLinkのバイト・コード・ウィービングを通じて実装され、Java EE 5準拠アプリケーション・サーバーで実行されていない場合は明示的に有効にする必要があります。詳細は、バイト・コード・ウィービングでのコンパイル済Javaクラスの変更を参照してください。

1.6.3 TopLink Gridを使用するアプリケーションに対するニア・キャッシュの定義

ニア・キャッシュは、Oracle Coherenceによって提供される標準キャッシュ構成の1つです。ニア・キャッシュを使用すると、オブジェクトを繰り返し取得する場合にネットワーク・アクセスを回避することでスループットを向上することができます。たとえば、ユーザーが特定のWebサーバーに固定されている環境では、ニア・キャッシュによりパフォーマンスが向上する可能性があります。

ニア・キャッシュはハイブリッド・キャッシュであり、サイズの制限された高速なデータ・アクセスを提供するフロント・キャッシュと、スケーラブルで要求に応じてロード可能であり、フェイルオーバー保護を提供する容量の大きいバック・キャッシュで構成されます。

TopLink Gridを使用するアプリケーションの場合、Oracle Coherenceを使用する他のアプリケーションと同じ方法でニア・キャッシュを構成します。ニア・キャッシュの詳細は、『Oracle Coherenceでのアプリケーションの開発』のニア・キャッシュとニア・キャッシュ・スキームの定義に関する項を参照してください。

注意:

ニア・キャッシュは、Coherenceキャッシュのget操作においてのみ使用され、Filter操作の実行時には使用されません。これは、Filter操作は各メンバーに送信され、各メンバーが結果をコール元に直接返すためです。この場合、ニア・キャッシュに値は追加されません。

これは、JPQL問合せを使用している場合に問題となることもあります。TopLink Gridのグリッド読取り構成またはグリッド・エンティティ構成では、JPQL問合せはFilter操作にマップされます。いずれの構成の場合も、TopLink JPQL問合せを実行してもキャッシュ・ヒットは発生しません。

1.6.4 キャッシュ構成において接頭辞付きのキャッシュ名でワイルドカードが使用されるようにする

TopLink GridをCoherenceキャッシュおよびCoherence*Webを使用するアプリケーションとともに使用する場合、エンティティに対するTopLink GridキャッシュとCoherence*Webキャッシュに異なる構成プロパティを適用することが必要になることがあります。一連のキャッシュを指定および構成する最も効率的な方法は、ワイルドカード文字(*)を使用することです。ただし、これは両方のキャッシュ・セットに一致します。Coherence*Webキャッシュをエンティティ・キャッシュと区別するには、エンティティにのみ一致するワイルドカード・パターンを作成する必要があります。これを実行する1つの方法は、エンティティ・キャッシュ名に一意の接頭辞を付加することです。

次の手順は、TopLink Grid対応クラスに特定の接頭辞を付加するためにカスタム・セッション・カスタマイザを作成して使用する方法を示しています。

1. 指定した接頭辞をTopLink対応クラスに付けるセッション・カスタマイザ・クラスを作成します。
次の例は、EclipseLink SessionCustomizerクラスを実装するカスタム・セッション・カスタマイザ・クラスであるCacheNamePrefixCustomizerを示しています。このクラスは、TopLink対応クラスに追加される接頭辞を表すPREFIX_PROPERTY myapp.cache-prefixを定義します。このプロパティの値は、persistence.xmlファイルで指定することも(手順2で説明)、Persistence.createEntityManagerFactoryメソッドにオプションのプロパティ・マップで渡すこともできます。

import java.util.Collection;

import oracle.eclipselink.coherence.IntegrationProperties;
import oracle.eclipselink.coherence.integrated.cache.CoherenceInterceptor;
import oracle.eclipselink.coherence.integrated.internal.cache.CoherenceCacheHelper;
import org.eclipse.persistence.config.SessionCustomizer;
import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.sessions.Session;

public class CacheNamePrefixCustomizer implements SessionCustomizer {

private static final String PREFIX_PROPERTY = "myapp.cache-prefix";

public void customize(Session session) throws Exception {
// Look up custom persistence unit cache prefix property
String prefix = (String) session.getProperty(PREFIX_PROPERTY);
if (prefix == null) {
throw new RuntimeException(
"Cache name prefix customizer configured but prefix property '" +
PREFIX_PROPERTY + "' not specified");
}
// Iterate over all entity descriptors
Collection<ClassDescriptor> descriptors = session.getDescriptors().values();
for (ClassDescriptor classDescriptor : descriptors) {
// If entity is TopLink Grid-enabled, prepend cache name with prefix
if (CoherenceInterceptor.class.equals(classDescriptor.getCacheInterceptorClass())) {
String cacheName = CoherenceCacheHelper.getCacheName(classDescriptor);
classDescriptor.setProperty(IntegrationProperties.COHERENCE_CACHE_NAME, prefix + cacheName);
}
}
}
}

2. persistence.xmlファイルを編集して接頭辞プロパティの値を宣言します。
次の例では、persistence.xmlファイル内で接頭辞プロパティmyapp.cache-prefixの値としてMyApp_が定義されています。myapp.cache-prefix接頭辞プロパティは、カスタム・セッション・カスタマイザ・ファイルで定義されます。

<property name="myapp.cache-prefix" value="MyApp_"/>

EclipseLink SessionCustomizerクラスの詳細は、http://www.eclipse.org/eclipselink/を参照してください。

3. persistence.xmlファイルを編集し、カスタム・セッション・カスタマイザ・クラスをeclipselink.session.customizerコンテキスト・プロパティの値として追加します。

<property name="eclipselink.session.customizer" value="CacheNamePrefixCustomizer"/>

4. coherence-cache-config.xmlファイルを編集し、キャッシュ・マッピングにワイルドカード文字を含む接頭辞の名前を追加します。

<cache-mapping>
<cache-name>MyApp_*</cache-name>
<scheme-name>eclipselink-distributed-readonly</scheme-name>
</cache-mapping>

1.6.5 デフォルト・キャッシュ名のオーバーライド

エンティティ・キャッシュに指定されたデフォルト名のオーバーライドが必要になる場合があります。TopLink Gridでは、エンティティ・キャッシュ名はデフォルトでエンティティ名になります。次のリストは、キャッシュ名の決定方法とそれを明示的に変更する方法を示しています。

キャッシュ名はデフォルトで設定することも、明示的に設定することもできます。

- デフォルト: キャッシュ名はデフォルトでエンティティ名になります。一方、エンティティ名は、デフォルトで設定することも明示的に設定することもできます。

- デフォルト: エンティティ名はデフォルトでクラスの短縮名になります。

- 明示的: エンティティ名は、@Entity注釈のnameプロパティを使用することで明示的に設定できます。

- 明示的: キャッシュ名は、@Property注釈を使用することで明示的に設定できます。

たとえば、次のコード部分は、Employeeクラスを示しています。デフォルトでは、エンティティ・キャッシュ名はEmployeeになります。ただし、@Property注釈を使用することで、Employeeエンティティ・キャッシュの名前を強制的にEMP_CACHEにすることができます。

import static oracle.eclipselink.coherence.IntegrationProperties.COHERENCE_CACHE_NAME;
import org.eclipse.persistence.annotations.Property;

...
@Entity(name="Emp")
@Property(name=COHERENCE_CACHE_NAME, value="EMP_CACHE")
public class Employee implements Serializable {
...

コードでエンティティ名がEmpに明示的に指定されていることに注意してください。name="Emp"値が指定されていなければ、エンティティの名前にはクラスの短縮名であるEmployeeがデフォルトで使用されます。

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

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

注意:

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

この章の構成は、次のとおりです。

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

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

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のアプローチ

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-puはEmployeeエンティティを含む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とともに使用するサンプル・プロジェクト

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プロパティ(driver、url、user、passwordなど)には、データベースへの接続およびログインに適した値を指定します。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 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実装では、永続性ユニットがデプロイされるキャッシュ・ストア・コンテキストが認識され、適宜、構成が調整されます。

3 CoherenceアプリケーションとCoherence*Webの統合

この章では、Coherenceのキャッシュ情報およびセッション情報を共有できるように、Coherence*Webの下で稼働する複数のアプリケーションを構成する方法について説明します。

Coherence*Webの詳細および様々なアプリケーション・サーバー上で稼働するアプリケーションに対してそれを有効化する方法は、『Oracle Coherence*WebでのHTTPセッション・マネージメントの管理』を参照してください。

3.1 Coherenceキャッシュ情報とセッション情報のマージ

Coherenceでは、キャッシュ構成デプロイメント・ディスクリプタによって、クラスタ内のアプリケーションが使用できる様々なキャッシュに関する詳細情報が提供されます。Coherenceでは、coherence.jarライブラリのルートにcoherence-cache-config.xmlという名前のサンプル・キャッシュ構成デプロイメント・ディスクリプタが提供されています。

Coherence*Webでは、セッション・キャッシュ構成デプロイメント・ディスクリプタによって、HTTPセッション管理に使用されるキャッシュ、サービスおよび属性に関する詳細情報が提供されます。Coherence*Webでは、coherence-web.jarライブラリにdefault-session-cache-config.xmlという名前のサンプル・セッション・キャッシュ構成デプロイメント・ディスクリプタが提供されています。このファイルは、記述する必要のあるスタム・セッション・キャッシュ構成ファイルの基礎として使用できます。

実行時には、Coherenceでは、クラスパスで最初に見つかったcoherence-cache-config.xmlファイルが使用されます。ただし、それには、これがcoherence.jarライブラリよりも前にある必要があり、そうでない場合は、coherence.jarファイルにあるサンプルのcoherence-cache-config.xmlファイルが使用されます。

Coherence*Webの場合は、最初にCoherence*Webの起動に使用されたクラスローダー内のカスタム・セッション・キャッシュ構成XMLファイルが検索されます。カスタム・セッション・キャッシュ構成XMLリソースが見つからない場合は、coherence-web.jarにパッケージ化されているdefault-session-cache-config.xmlファイルが使用されます。

CoherenceアプリケーションがHTTPセッション管理のためにCoherence*Webを使用している場合、そのアプリケーション・サーバーとCoherenceキャッシュ・サーバーの起動スクリプトは、キャッシュ構成ファイルではなく、セッション・キャッシュ構成ファイルを参照する必要があります。その場合、次の手順を実行する必要があります。

1. セッション・キャッシュ構成ファイルをcoherence-web.jarライブラリから抽出します。

2. Coherenceキャッシュ構成ファイルからセッション・キャッシュ構成ファイルにキャッシュ情報をマージします。
このファイルのキャッシュ・スキーム・マッピングでは、キャッシュ名の指定にワイルドカードは使用できません。少なくとも、共通の接頭辞をアプリケーション・キャッシュ名に指定する必要があります。

3. 変更されたセッション・キャッシュ構成ファイルが、クラスタ内のCoherenceメンバーによって使用されていることを確認してください。
キャッシュとセッションの構成は、WebLogic ServerとCoherenceキャッシュ・サーバーとの間で一貫している必要があります。

4 HibernateとCoherenceの統合

この章では、Java環境用のオブジェクト・リレーショナル・マッピング・ツールであるHibernateとOracle Coherenceとの統合に関する情報を参照できる場所について説明します。Oracle CoherenceとHibernateの機能を組み合せて、たとえば、HibernateをCoherenceのキャッシュ・ストアとして使用したり、CoherenceをHibernateのL2キャッシュとして使用したりすることができます。

Coherenceコミュニティ・プロジェクトにおけるCoherenceとHibernateの統合に関する情報は、次のURLを参照してください。

https://java.net/projects/cohhib

5 CoherenceとSpringの統合

この章では、Javaベースのエンタープライズ・アプリケーションを作成して実行するためのプラットフォームであるSpringとOracle Coherenceとの統合に関する情報を参照できる場所について説明します。Springプラットフォームによって用意されたオブジェクトをCoherenceコミュニティ・プロジェクトで使用するようにOracle Coherenceキャッシュを構成する方法について情報を検索できます。Coherenceコミュニティ・プロジェクトには、Oracle Coherenceに基づいて一般的に使用される設計パターンの実装例が用意されています。次のURLを参照してください。

https://java.net/projects/cohspr/

6 CoherenceログでのECIDの有効化

この章では、Oracle Coherenceで実行コンテキストID (ECID)を使用する方法について説明します。このグローバルに一意のIDをOracleコンポーネント間のリクエストにアタッチできます。ECIDを使用すると、複数のリクエストが並行して処理される場合に同じリクエストに関する複数のログ・メッセージを追跡できます。

Coherence操作が呼び出される前にクライアントがすでにアクティブ化されたECIDを持っている場合にのみ、CoherenceログにECIDが含まれます。ECIDは、別のコンポーネントから渡される場合や、クライアント・コードで取得される場合があります。コンテキストをアクティブ化するには、Coherenceクライアント・コードでoracle.dms.context.ExecutionContextインタフェースのgetおよびactivateメソッドを使用します。ECIDが実行中のスレッドにアタッチされます。deactivateメソッドを使用して、コンテキストを解放します。次に例を示します。

例6-1 Coherenceクライアント・コードでのDMSコンテキストの使用方法

...
// Get the context associated with this thread
ExecutionContext ctx = ExecutionContext.get();
ctx.activate();
...
set additional execution context values (optional)
perform some cache operations
...
// Release the context
ctx.deactivate();
...

ECIDロギングは、クライアントが実行されているノードでのみ行われます。クライアント・リクエストが他のノードで処理されており、Coherenceによって例外がスローされる場合、リモート・エラーが元のノードに返され、それがCoherenceクライアントで記録されます。ログ・メッセージにはリクエストのECIDが含まれます。リモート・ノードで記録されるメッセージにはECIDは含まれません。

Coherenceログ・メッセージにECIDを含める方法の詳細は、Oracle Coherenceでのアプリケーションの開発のログ・メッセージ形式の変更を参照してください。

7 Oracle Coherence GoldenGate HotCacheとの統合

この章では、Coherenceキャッシュを使用するアプリケーションとともに (HotCache)を使用する方法について説明します。HotCacheを使用すると、データベースに対する変更をCoherenceキャッシュ内のオブジェクトに伝播できます。

Oracle GoldenGateの詳細は、このドキュメントでは述べません。GoldenGateをOracleデータベースにインストールする方法の詳細は、『Oracle DatabaseのためのOracle GoldenGateのインストールおよび構成』を参照し、また『Oracle GoldenGateアダプタの管理』を参照してください。

注意:

HotCacheを使用するには、Oracle GoldenGateおよびCoherence Grid Editionのライセンスが必要です。HotCacheは、Oracle GoldenGate 11gR1、11gR2および12cのリリースで使用できます。

この章の構成は、次のとおりです。

- 概要

- HotCacheの機能

- 前提条件

- GoldenGateの構成

- HotCacheの構成

- GoldenGate Javaクライアントの構成

- HotCacheでのPortable Object Formatの使用

- TopLink Gridアプリケーション用のラッパー・クラスの有効化

7.1 概要

データベースに対するサード・パーティの更新により、Coherenceアプリケーションで、最新でない失効した可能性のあるデータが使用されることがあります。HotCacheは、データベースをモニタリングし、変更をCoherenceキャッシュにプッシュすることでこの問題を解決します。HotCacheには、失効したデータのみを処理する効率的なプッシュ・モデルが採用されています。データベースに変更が行われる際にデータがプッシュされるため、待機時間の短さが保証されます。

HotCacheは、どのようなCoherenceアプリケーションにも追加できます。データベース・データからJavaオブジェクトへのマッピングの取得には標準JPAが使用されます。構成は、XMLのみで取得することも、注釈を使用したXMLで取得することできます。

次のシナリオは、HotCacheをデータベースと連動して使用する方法、およびCoherenceキャッシュを使用するアプリケーションと連動するように使用する方法を示しています。図7-1にこのシナリオを示します。

1. GoldenGateの起動方法の詳細は、『Oracle GoldenGateアダプタの管理』のアプリケーションの起動に関する項を参照してください。GoldenGateによって、目的の変更に対するトランザクション・ログがモニターされます。これらの変更内容は追跡ファイルに格納されます。

2. 必要に応じてCoherenceキャッシュ・サーバーを起動し、キャッシュをウォーミングします。

3. HotCacheを起動して、追跡ファイル内の変更内容をキャッシュに伝播できるようにします。キャッシュのウォーミング中に変更が発生した場合は、変更内容が消失しないように、HotCacheが起動するとその変更が即時にキャッシュに適用されます。

4. アプリケーション・クライアントを起動します。その操作の一部として、アプリケーションによってキャッシュに対する問合せが繰り返し実行されることを想定します。

5. サード・パーティ・アプリケーションによって、データベースの直接更新が実行されます。

6. GoldenGateによってデータベースの変更が検出され、それがHotCacheによってCoherenceキャッシュに伝播されます。

7. アプリケーション・クライアントによって、キャッシュ内の変更が検出されます。

図7-1 HotCacheによるキャッシュへのデータベース変更の伝播方法

7.2 HotCacheの機能

HotCacheは、GoldenGateから配信されるデータベース変更イベントを処理し、それらの変更をCoherenceキャッシュ内の影響を受けるオブジェクトにマップします。これは、Java Persistence API (JPA)マッピング・メタデータを使用することで実行できます。JPAは、Javaにおけるオブジェクト・リレーショナル・マッピングのJava標準であり、リレーショナル表にJavaオブジェクトがどのようにマップされるのかを示す一連の注釈(および対応するXML)を定義します。例7-1に示すように、Employeeクラスのインスタンスは、次の注釈を使用することでEMPLOYEE表の行にマップできます。

例7-1 JavaコードによるEmployeeクラスのインスタンスの行へのマッピング

@Entity
@Table(name="EMPLOYEE")
Public class Employee {
@Id
@Column(name="ID")
private int id;
@Column(name="FIRSTNAME")
private String firstName;
…
}

@Entity注釈はEmployeeクラスを永続としてマークし、@Id注釈は主キーを含んでいるとしてidフィールドを識別します。Coherenceのキャッシュ・オブジェクトの場合、@Idフィールドには、キャッシュされるオブジェクトが属するキーの値も含まれている必要があります。@Tableおよび@Column注釈は、指定した表とクラス、および指定した列とフィールドをそれぞれ関連付けます。

簡単にするため、JPAではtable name=class nameやcolumn name=field nameなど、いくつかのデフォルト・マッピングが想定されており、多くの場合、マッピングを指定する必要があるのはそのデフォルトが適切でない場合のみです。例7-1では表とフィールドの両方の名前がJava名と一致しているため、例7-2に示すように、@Tableと@Columnを削除してコードを短くできます。

例7-2 Employeeクラスのインスタンスを行にマッピングする単純化したJavaコード

@Entity
Public class Employee {
@Id
private int id;
private String firstName;
…
}

前述のJavaコードの例はXMLでも表現できます。例7-1のJavaコードに相当するXMLを例7-3に示します。

例7-3 XMLによるEmployeeクラスのインスタンスの行へのマッピング

<entity class="Employee">
<table name="EMPLOYEE"/>
<attributes>
<id name="id">
<column name="ID"/>
</id>
<basic name="firstName"/>
<column name="FIRSTNAME"/>
</basic>
...
</attributes>
</entity>

同様に、例7-2の単純化したJavaコードに相当するXMLを例7-4に示します。

例7-4 Employeeクラスのインスタンスを行にマッピングする単純化したXML

<entity class="Employee">
<attributes>
<id name="id"/>
<basic name="firstName"/>
...
</attributes>
</entity>

7.2.1 GoldenGate JavaアダプタによるJPAマッピング・メタデータの使用方法

JPAマッピング・メタデータは、オブジェクトからリレーショナルへのマッピングを提供しますが、HotCacheで使用できるリレーショナルからオブジェクトへの逆マッピングも提供します。Employeeの例で、EMPLOYEE表の行のFIRSTNAME列への更新を考えてみましょう。図7-2は、Johnという名が従業員ID 1と関連付けられている更新前のEMPLOYEE表と、Bobという名が従業員ID 1と関連付けられている更新後のEMPLOYEE表を示しています。

図7-2 更新前および後のEMPLOYEE表

GoldenGateによってEMPLOYEE表に対する変更がモニタリングされており、HotCacheが適切な追跡ファイルで構成されている場合、アダプタによって、主キー1を持つEMPLOYEE行のFIRSTNAME列がBobに変更されたことを示すイベントが処理されます。アダプタは、JPAマッピング・メタデータを使用して、最初にEMPLOYEE表に関連付けられているクラスEmployeeを識別し、次にEmployeeのIDフィールドと関連付けられている列IDを判別します。この情報を使用して、アダプタは変更イベントからそのID列値を抽出し、そのID列値でキャッシュされているEmployeeのfirstNameフィールド(FIRSTNAME列と関連付けられた)を更新できます。

7.2.2 サポートされているデータベース操作

GoldenGate Javaアダプタでは、データベースのINSERT、UPDATEおよびDELETE操作がサポートされています。マップされた表にINSERT操作を実行すると、関連付けられたクラスの新しいインスタンスが追加され、新たに挿入された行のデータが移入されます。UPDATE操作で適用される変更内容は、対応するキャッシュ・オブジェクトに伝播されます。更新された行に対応するオブジェクトがキャッシュに含まれていなければ、キャッシュは変更されません。DELETE操作を実行すると、対応するオブジェクトがキャッシュに存在する場合はキャッシュから削除されます。

7.3 前提条件

次の項の説明は、データベースがGoldenGateを使用するように設定されていることを前提とします。これには、次の作業が含まれます。

- データベースおよび表の作成

- ユーザー権限の付与

- ロギングの有効化

- 表およびデータのプロビジョニング

例7-5に、csdemoというユーザーを作成し、データベースに対するユーザー権限を付与するOracle Databaseのサンプル・コマンドのリストを示します。

ALTER DATABASE ADD SUPPLEMENTAL LOG DATAコマンドに注意してください。サプリメンタル・ロギングを有効にすると、すべての列が追加のロギング対象として指定されます。少なくとも、どのようなチェンジ・データ・キャプチャのソース・データベースに対しても、最小データベース・レベルのサプリメンタル・ロギングを有効にする必要があります。

例7-5 ユーザーの作成、権限の付与およびロギングの有効化を実行するサンプル・コマンド

CREATE USER csdemo IDENTIFIED BY csdemo;
GRANT DBA TO csdemo;
grant alter session to csdemo;
grant create session to csdemo;
grant flashback any table to csdemo;
grant select any dictionary to csdemo;
grant select any table to csdemo;
grant select any transaction to csdemo;
grant unlimited tablespace to csdemo;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

また、次の項の説明は、Oracle GoldenGateがインストールされ、マネージャが起動されていることを前提とします。これには、次の作業が含まれます。

- Oracle GoldenGateのダウンロードおよびインストール

- ggsciの実行によるGoldenGateサブディレクトリの作成

- マネージャ・パラメータ(mgr.prm)ファイルの作成、リスナー・ポートの指定

- ライブラリ・パスへのJVMライブラリの追加

- マネージャの起動

これらのタスクの詳細は、このドキュメントでは述べません。GoldenGateをOracleデータベースにインストールする方法の詳細は、『Oracle DatabaseのためのOracle GoldenGateのインストールおよび構成』を参照し、また『Oracle GoldenGateアダプタの管理』を参照してください。

7.4 GoldenGateの構成

GoldenGate追跡ファイルからのキャッシュの更新では、GoldenGateおよびHotCacheを構成する必要があります。その後、GoldenGate Javaアダプタを構成することでHotCacheを有効にします。

- 表の変更のモニター

- 現在のユーザーが実行した変更のフィルタ処理

7.4.1 表の変更のモニター

ADD TRANDATAコマンドを使用して変更をモニターする必要がある表を指定します。ADD TRANDATAコマンドは、コマンド行で、またはggsciスクリプトの一部として使用できます。たとえば、csdemoスキーマの表への変更をモニターするには、次のコマンドを使用します。

ADD TRANDATA csdemo.*

例7-6に、cs-cap.ggsciというggsciスクリプトのサンプルを示します。

- スクリプトがマネージャを起動してデータベースにログインします。cs-capという実行中の抽出を停止して削除します。

- ADD TRANDATAコマンドで抽出を指示し、csdemo*という表に対する変更をモニターします。

- SHELLコマンドでdirdatディレクトリのすべての追跡ファイルを削除し、抽出が再作成された場合に古い追跡ファイルが残存しないようにします。rm -fコマンドはプラットフォーム固有です。dirprm/cs-cap.prmファイルからパラメータを使用して、cs-capという抽出が作成されます。追跡はcs-cap抽出ファイルからdirdat/csに追加されます。

- startコマンドでcs-cap.ggsciスクリプトが開始します。

- ADD EXTRACTコマンドはcs-cap.prmファイルをパラメータのソースとして自動的に使用するため、PARAMS dirprm/cs-cap.prm文は必要ありません。

例7-6 表の変更をモニターするGoldenGate Javaアダプタggsciスクリプトのサンプル

start mgr
DBLOGIN USERID csdemo, PASSWORD csdemo
STOP EXTRACT cs-cap
DELETE EXTRACT cs-cap
ADD TRANDATA csdemo.*
ADD EXTRACT cs-cap, tranlog, begin now
SHELL rm -f dirdat/cs*
ADD EXTTRAIL dirdat/cs, EXTRACT cs-cap
start cs-cap

7.4.2 現在のユーザーが実行した変更のフィルタ処理

Coherence CacheStoresにログインしているユーザーが行った変更が無視されるようにGoldenGateを構成します。これにより、Coherenceによってデータベースに適用された、キャッシュにすでに存在する変更の処理が回避されます。

TranLogOptions excludeUSERコマンドは、コマンド行で、またはggsciスクリプト内で使用できます。たとえば、次のコマンドはcsdemoでログインしたCoherence CacheStoreユーザーが行ったデータベース表への変更を無視するようにGoldenGate抽出プロセスに指示します。

TranLogOptions excludeUser csdemo

例7-7に、cs-cap.prmという抽出.prmファイルのサンプルを示します。Coherence CacheStoreにログインしているユーザーはcsdemoです。recoveryOptions OverwriteMode行は、新しいデータを追加せずに、既存のトランザクション・データを最後の書込みチェックポイント位置の後に上書きすることを示します。EXTRAILパラメータで、追跡がdirdat/csであることが識別されます。BR BROFFパラメータは、Bounded Recovery (BR)機能を制御します。BROFF値は、実行とリカバリに対してBounded Recoveryをオフにします。GETUPDATEBEFORESパラメータは、更新された列の更新前のイメージがOracle GoldenGateで処理されるレコードに格納されることを示します。TABLEパラメータで、変更をモニターする表がcsdemo.*であることが識別されます。TranLogOptions excludeUSERパラメータは、csdemoでログインしたCoherence CacheStoreユーザーが行った表への変更がGoldenGateで無視されることを示します。

例7-7 GoldenGate Javaアダプタの抽出.prmファイルのサンプル

EXTRACT cs-cap
USERID csdemo, PASSWORD csdemo
RecoveryOptions OverwriteMode
EXTTRAIL dirdat/cs
BR BROFF
getUpdateBefores
TABLE csdemo.*;
TranLogOptions excludeUser csdemo --ignore changes made by csuser

7.5 HotCacheの構成

HotCacheは、システム・プロパティ、EclipseLink JPAマッピング・メタデータ(HotCacheの機能を参照)およびJPA persistence.xmlファイルで構成されます。HotCacheからCoherenceクラスタへの接続はCoherence*Extend (TCP)を使用して実行でき、またはHotCache JVMはCoherenceクラスタをメンバーとして結合できます。

次の項では、HotCacheの構成に必要なプロパティと、Coherence*Extendとの接続の詳細について説明します。

- GoldenGate for Javaのプロパティでのプロパティ・ファイルの作成

- プロパティ・ファイルへのJavaブート・オプションの追加

- Coherence*Extend接続情報の指定

7.5.1 GoldenGate for Javaのプロパティでのプロパティ・ファイルの作成

ファイル名の拡張子が.propertiesのテキスト・ファイルを作成します。ファイルにHotCacheの構成を入力します。構成には少なくともイベント・ハンドラのリスト、イベント・ハンドラの完全修飾Javaクラス、ユーザー出口チェックポイント・ファイルを使用しているかどうか、およびJavaライター名が含まれている必要があります。

注意:

.propertiesファイルへのパスは、次の例のようにGoldenGate JavaアダプタのGGS_USEREXIT_CONF変数の値として.prmファイルに設定する必要があります。

SetEnv(GGS_USEREXIT_CONF="dirprm/cs-cgga.properties")

この説明は、GoldenGate Javaクライアント抽出ファイルの編集にあります。

例7-8に、HotCacheプロジェクトについて最低限の構成が格納された.propertiesファイルを示します。ファイルでは、次のプロパティが使用されています。

- gg.handlerlist=cgga
gg.handlerlistプロパティには、アクティブなハンドラのカンマ区切りリストを指定します。この例では、論理名cggaをデータベース変更イベント・ハンドラとして定義しています。ハンドラ名はユーザーが定義できますが、gg.handler.{name}.typeプロパティで使用する名前と一致する必要があります。

- gg.handler.cgga.type=oracle.toplink.goldengate.CoherenceAdapter
gg.handler.{name}.typeプロパティには、HotCacheのハンドラを定義します。{name}フィールドは、gg.handlerlistプロパティにリストされているイベント・ハンドラ名で置換する必要があります。HotCacheに対して設定できる唯一のハンドラはoracle.toplink.goldengate.CoherenceAdapterです。

- goldengate.userexit.nochkpt=true
goldengate.userexit.nochkptプロパティを使用して、ユーザー出口チェックポイント・ファイルを無効にします。この例では、ユーザー出口チェックポイント・ファイルを無効に定義しています。

- goldengate.userexit.writers=jvm
goldengate.userexit.writersプロパティには、ライターの名前を指定します。GoldenGate Javaアダプタの呼出しを有効にするには、goldengate.userexit.writersの値をjvmにする必要があります。

- -Dlog4j.configuration=my-log4j.properties
-Dlog4j.configurationプロパティには、dirprmディレクトリ(dirprmディレクトリはクラスパスにすでに存在)のユーザー定義Log4Jプロパティ・ファイルmy-log4j.propertiesを指定します。プロパティはクラスパスからロードできるため、この文はオプションです(つまり、log4j.configuration=my-log4j.properties)。HotCacheのロギング・プロパティの構成の詳細は、ロギング・プロパティを参照してください。

その他の様々なプロパティを使用して、GoldenGate Javaアダプタの動作を制御できます。詳細は、『Oracle GoldenGateアダプタの管理』を参照してください。

例7-8 HotCacheプロジェクトの.propertiesファイル

# ====================================================================
# List of active event handlers. Handlers not in the list are ignored.
# ====================================================================
gg.handlerlist=cgga

# ====================================================================
# Coherence cache updater
# ====================================================================
gg.handler.cgga.type=oracle.toplink.goldengate.CoherenceAdapter

# ====================================================================
# Native JNI library properties
# ====================================================================
goldengate.userexit.nochkpt=true
goldengate.userexit.writers=jvm

# ======================================
# Java boot options
# ======================================
jvm.bootoptions=-Djava.class.path=dirprm:/home/oracle/app/oracle/product/11.2.0/dbhome_2/jdbc/lib/ojdbc6.jar:ggjava/ggjava.jar:/home/oracle/Oracle/Middleware/coherence/lib/coherence.jar:/home/oracle/Oracle/Middleware/coherence/lib/coherence-hotcache.jar:/home/oracle/Oracle/Middleware/oracle_common/modules/javax.persistence_2.0.0.0_2-0.jar:/home/oracle/Oracle/Middleware/oracle_common/modules/oracle.toplink_12.1.2/eclipselink.jar:/home/oracle/Oracle/Middleware/oracle_common/modules/oracle.toplink_12.1.2/toplink-grid.jar:/home/oracle/cgga/workspace/CacheStoreDemo/bin -Xmx32M -Xms32M -Dtoplink.goldengate.persistence-unit=employee -Dlog4j.configuration=my-log4j.properties -Dcoherence.distributed.localstorage=false -Dcoherence.cacheconfig=/home/oracle/cgga/workspace/CacheStoreDemo/client-cache-config.xml -Dcoherence.ttl=0

7.5.2 プロパティ・ファイルへのJavaブート・オプションの追加

この項では.propertiesファイルのJava boot optionsセクションに指定する必要のあるプロパティについて説明します。これらのオプションはjvm.bootoptionsプロパティを使用して定義します。

jvm.bootoptionsのサンプル・リストは、例7-8のJava boot optionsセクションに記載されています。

- Javaクラスパス・ファイル

- HotCache関連プロパティ

- Coherence関連プロパティ

- ロギング・プロパティ

7.5.2.1 Javaクラスパス・ファイル

次のリストは、Javaクラスパスに含める必要があるディレクトリおよびJARファイルです。ディレクトリおよびJARファイルはjava.class.pathプロパティで定義します。

- dirprm: 抽出.prmファイルが含まれているGoldenGate dirprmディレクトリ

- ggjava.jar: GoldenGate Javaアダプタ・ライブラリが含まれています

- coherence.jar: Oracle Coherenceライブラリが含まれています

- coherence-hotcache.jar: Oracle Coherence GoldenGate HotCacheライブラリが含まれています

- javax.persistence_2.0.0.0_2-0.jar: Java永続ライブラリが含まれています

- eclipselink.jar: EclipseLinkライブラリが含まれています

- toplink-grid.jar: HotCacheで必要なOracle TopLinkライブラリが含まれています

- ドメイン・クラス: Coherenceにキャッシュされているユーザー・クラスを含むJARファイルまたはディレクトリ。HotCacheで使用するためにJPAにマップされています。Coherence構成ファイル、persistence.xmlファイルおよびorm.xmlファイルも同様。

7.5.2.2 HotCache関連プロパティ

toplink.goldengate.persistence-unitプロパティは必須で、HotCacheがロードするpersistence.xmlファイルに定義された永続性ユニットを識別します。永続性ユニットには、関与しているドメイン・クラスのリスト、構成オプション、データベース接続情報(必要な場合)などの情報が含まれています。

toplink.goldengate.on-errorプロパティはオプションです。変更イベントの処理時に、アダプタがエラーに応答する方法を制御します。このレスポンスは、予想されるオプティミスティック・ロック例外と予期しない例外の両方に適用されます。このプロパティはオプションで、デフォルトでは「Refresh」の値に設定されます。Refreshを指定すると、アダプタでは、データベースからの指定行の最新データの読取りと、キャッシュ内の対応するオブジェクトの更新が試行されます。Refreshでは、データベース接続がpersistence.xmlファイルに指定されている必要があります。この接続はHotCacheの初期化中に確立されます。接続できない場合は、例外がスローされ、HotCacheの起動は失敗となります。

その他のエラー時戦略にはデータベース接続は必要ありません。次のものがあります。

- Ignore - 例外のみをログに記録します。キャッシュに古いデータが残存する可能性があります。アプリケーションの要件およびキャッシュ・エビクション・ポリシーに応じて許容します。

- Evict - 警告をログに記録し、変更データベース行に対応するオブジェクトをキャッシュから排出します。

- Fail - 例外をスローしてHotCacheを終了します。

7.5.2.3 Coherence関連プロパティ

Java boot optionsでは、Coherenceの任意のプロパティをシステム・プロパティとして指定できます。falseの値のcoherence.distributed.localstorageシステム・プロパティは、Java boot optionsで渡す必要がある唯一のCoherenceプロパティです。Coherenceのすべてのプロパティと同様に、jvm.bootoptions文ではプロパティ名に-D接頭辞を付けます。次に例を示します。

-Dcoherence.distributed.localstorage=false

7.5.2.4 ロギング・プロパティ

HotCacheに対して次のロギング・プロパティを定義できます。

-Dlog4j.configuration=default-log4j.propertiesプロパティはデフォルトのLog4J構成ファイルを指定します。プロパティの例は、$GOLDEN_GATE_HOME/ggjava/resources/classes/ディレクトリにあります。これらを既存のLog4J構成にマージできます。

GoldenGate for Javaに付属のLog4Jプロパティ・ファイルはデモ専用です。ファイルをそのまま使用することも、内容を既存のLog4Jプロパティにマージすることもできます。

ファイルをそのまま使用する場合は、dirprmディレクトリにコピーして新しい名前を指定し、-Dlog4j.configurationプロパティで指定します。たとえば、次の行はdirprmディレクトリにあるユーザー定義のmy-log4j.propertiesファイル(dirprmディレクトリはクラスパスにすでに指定済)を指定します。

-Dlog4j.configuration=my-log4j.properties

現在の位置でデフォルトのプロパティ・ファイルを使用すると、アップグレード時に問題が発生する可能性があります。変更内容は新しい配布のインストール時に消失します。

HotCacheで警告を記録できるようにするには、プロパティ・ファイルに次の行を追加します。

log4j.logger.oracle.toplink.goldengate=WARN, stdout, rolling

HotCacheでエラーを記録できるようにするには、使用するプロパティ・ファイルに次の行を追加します。

-Dlog4j.logger.oracle.toplink.goldengate=DEBUG, stdout, rolling

注意:

Coherence Log4J構成は、GoldenGate Log4J構成と共存できます。どちらもjvm.bootoptionsパスで構成される同じファイルに含めることができます。

7.5.3 Coherence*Extend接続情報の指定

HotCacheとCoherenceクラスタ間は、Coherence*Extendで接続されます。Coherence*Extendの詳細は、Oracle Coherenceリモート・クライアントの開発を参照してください。

Coherenceの構成ファイルは.propertiesファイルのjvm.bootoptions=-Djava.class.path= ...エントリで指定されたディレクトリに存在する必要があります。1つの例として、例7-8のjvm.bootoptionsエントリを参照してください。

例7-9に、Coherenceクラスタへの接続にCoherence*Extendを使用するクライアント・キャッシュ構成ファイルのセクションを示します。クライアント・キャッシュ構成ファイルでは、Coherence*Extendは<remote-cache-scheme>セクションで構成されます。デフォルトでは、Coherence*Extendの接続ポートは9099です。

例7-9 クライアント・キャッシュ構成ファイルのCoherence*Extendセクション

<cache-config>
...
<caching-schemes>
<remote-cache-scheme>
<scheme-name>CustomRemoteCacheScheme</scheme-name>
<service-name>CustomExtendTcpCacheService</service-name>
<initiator-config>
<tcp-initiator>
<remote-addresses>
<socket-address>
<address>localhost</address>
<port>9099</port>
</socket-address>
</remote-addresses>
</tcp-initiator>
<outgoing-message-handler>
...
</outgoing-message-handler>
</initiator-config>
</remote-cache-scheme>
...
</cache-config>

例7-10に、Coherence*Extend接続をリスニングするサーバー・キャッシュ構成ファイルのセクションを示します。サーバー・キャッシュ構成ファイルでは、Coherence*Extendは<proxy-scheme>セクションで構成されます。デフォルトでは、Coherence*Extendのリスナー・ポートは9099です。

例7-10 サーバー・キャッシュ構成ファイルのCoherence*Extendセクション

<cache-config>
...
<caching-schemes>
...
<proxy-scheme>
<scheme-name>CustomProxyScheme</scheme-name>
<service-name>CustomProxyService</service-name>
<thread-count>2</thread-count>
<acceptor-config>
<tcp-acceptor>
<local-address>
<address>localhost</address>
<port>9099</port>
</local-address>
</tcp-acceptor>
</acceptor-config>
<load-balancer>proxy</load-balancer>
<autostart>true</autostart>
</proxy-scheme>

</caching-schemes>
</cache-config>

7.6 GoldenGate Javaクライアントの構成

GoldenGate Javaクライアントには、イベント・ハンドラ・クラスを構成することで、JavaのGoldenGateデータ変更イベントを処理する方法が用意されています。GoldenGate Javaクライアントの構成により、抽出をモニターしたり、データ変更イベントをHotCacheに渡すことができます。

この構成は抽出.prmファイルで用意します。このファイルについては次の項で説明します。抽出.prmファイルには、イベント・ハンドラ・クラスへの参照も含まれています。これは、GoldenGate for Javaのプロパティでのプロパティ・ファイルの作成で説明されているプロパティ・ファイルに指定されたイベント・ハンドラ・クラスと同じです。

7.6.1 GoldenGate Javaクライアント抽出ファイルの編集

この項では、GoldenGate Javaクライアントの抽出.prmファイルに定義できるパラメータについて説明します。例7-11にパラメータを示しますが、これはHotCacheプロジェクトの最小限の構成です。

これらのパラメータおよび抽出.prmファイルに追加できる他のパラメータの詳細は、『Oracle GoldenGateエラー・メッセージ・リファレンスfor Windows and UNIX』を参照してください。

- SetEnv ( GGS_USEREXIT_CONF = "dirprm/cs-cgga.properties" )
GGS_USEREXIT_CONFプロパティは、GoldenGate for Javaのプロパティでのプロパティ・ファイルの作成」で作成した.propertiesファイルへの参照を提供します。cs-cgga.propertiesという名前で、dirprmフォルダに格納されていることが前提となります。

- GETUPDATEBEFORES
GETUPDATEBEFORESプロパティは、変更前の値が提示された場合は列の変更前後の値が追跡に書き込まれるため、値を比較できます。変更前の値が提示されない場合は、変更後の値のみが書き込まれます。

- CUserExit libggjava_ue.so CUSEREXIT PassThru IncludeUpdateBefores
CUSEREXITパラメータには次のものがあります。

- libggjava_ue.so (UNIXの場合)またはggjava_ue.dll (Windowsの場合) - ユーザー出口ライブラリの場所

- CUSEREXIT - コールバック関数名(大文字で記載する必要がある)

- PASSTHRU - ダミー・ターゲット追跡を不要にする

- INCLUDEUPDATEBEFORES - トランザクションの整合性のために必要

- NoTcpSourceTimer
NOTCPSOURCETIMERパラメータを使用して、レポート作成のためにレプリケートされた操作のタイムスタンプをOracle GoldenGate環境内で管理します。NOTCPSOURCETIMERには当初のタイムスタンプ値が保持されます。NOTCPSOURCETIMERは、双方向構成でタイムスタンプベースの競合解決を使用する場合に使用します。

例7-11に、GoldenGate for Javaクライアントの.prmファイルのサンプルを示します。

例7-11 GoldenGate for Javaクライアントの.prmパラメータ・ファイルのサンプル

Extract cs-cgga
USERID csdemo, PASSWORD csdemo

SetEnv ( GGS_USEREXIT_CONF = "dirprm/cs-cgga.properties" )

-- the user-exit library (unix/linux)
CUserExit libggjava_ue.so CUSEREXIT PassThru IncludeUpdateBefores

-- the user-exit library (windows)
-- CUserExit ggjava_ue.dll CUSEREXIT PassThru IncludeUpdateBefores
--  pass all trail data to user-exit (don't ignore/omit/filter data)
GetUpdateBefores

-- TcpSourceTimer (default=on) adjusts timestamps in replicated records for more
-- accurate lag calculation, if time differences between source/target
NoTcpSourceTimer

-- pass all data in trail to user-exit. Can wildcard tables, but not schema name
Table csdemo.*;

7.7 HotCacheでのPortable Object Formatの使用

シリアライズとは、オブジェクトをバイナリ形式にエンコードするプロセスです。これは、Coherenceを使用してデータをネットワーク上で移動させることが必要になった場合に重要となる機能です。Portable Object Format (POF)は言語に依存しないバイナリ形式です。POFは領域と時間の両面で効率を向上させるように設計されており、Coherenceの使用時に不可欠なものとなっています。

HotCacheでPOFシリアライズを使用できますが、POF構成ファイル(pof-config.xml)を更新してHotCacheおよびTopLink Gridフレームワーク・クラスが登録できるようにする必要があります。pof-config.xmlファイルには、coherence-hotcache-pof-config.xmlファイルを含める必要があり、TopLinkGridPortableObjectユーザー・タイプおよびTopLinkGridSerializerをシリアライザとして登録する必要があります。各クラスに対する<type-idは一意である必要があり、すべてのクラスタ・インスタンスで一致している必要があります。POFファイルの構成方法の詳細は、Oracle Coherenceでのアプリケーションの開発のPOFオブジェクトの登録を参照してください。

<allow-interfaces>要素は、TopLinkGridPortableObjectインタフェースのすべてのインプリメンタに対して単一のクラスを登録できるようにするために、trueに設定する必要があります。

例7-12は、HotCacheのpof-config.xmlファイルのサンプルを示しています。integer_valueの値は、1000より大きい一意の整数値を表します。

例7-12 HotCacheのPOF構成ファイルのサンプル

<?xml version='1.0'?><pof-config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://xmlns.oracle.com/coherence/coherence-pof-config"xsi:schemaLocation="http://xmlns.oracle.com/coherence/coherence-pof-configcoherence-pof-config.xsd">
<user-type-list>
<include>coherence-hotcache-pof-config.xml</include>
<!-- User types must be above 1000 -->
...
<user-type>
<type-id><integer_value></type-id>
<class-name>oracle.eclipselink.coherence.integrated.cache.TopLinkGridPortableObject</class-name>
<serializer>
<class-name>oracle.eclipselink.coherence.integrated.cache.TopLinkGridSerializer</class-name>
</serializer>
</user-type>
...
</user-type-list>
<allow-interfaces>true</allow-interfaces>
...
</pof-config>

7.8 TopLink Gridアプリケーション用のラッパー・クラスの有効化

Coherenceキャッシュへの変更されたデータのポンプをHotCacheに依存するTopLink Gridアプリケーションでは、trueに設定したtoplink.goldengate.enable-toplinkgrid-clientコンテキスト・プロパティを使用して、Coherenceキャッシュ挿入用のJavaラッパー・クラスを生成できます

TopLink Gridは、JPA関係がTopLink Grid JPAクライアントによってCoherenceから取得される際に、先行および遅延するJPA関係を再構築するための、関係情報のエンコードをラッパーに依存しています。HotCacheでTopLink Gridを使用し、かつプロパティをtrueに設定していない場合、オブジェクト間の関係は、Coherenceキャッシュから取得された時点でNULLになります。

このコンテキスト・プロパティは、persistence.xmlファイル、またはHotCacheの.propertiesファイルのJavaブート・オプション・セクションのシステム・プロパティで設定できます。

8 memcachedクライアントとOracle Coherenceの併用

この章では、Oracle Coherence memcachedアダプタを構成する手順について説明します。memcachedアダプタを使用すると、Coherenceをmemcachedベースのクライアント向けの分散キャッシュとして使用できます。この章の手順は、既存のmemcachedクライアントを使用してCoherenceに接続することを前提としています。spymemcached APIで記述された単純なHello Worldクライアントが、デモ用に提供されています。

この章の構成は、次のとおりです。

- Oracle Coherence memcachedアダプタの概要

- memcachedアダプタの設定

- memcachedアダプタへの接続

- memcachedクライアント通信の保護

- memcachedクライアントとCoherenceクライアント間のデータ共有

8.1 Oracle Coherence memcachedアダプタの概要

memcachedアダプタは、memcachedバイナリ・プロトコルを介したCoherenceキャッシュへのアクセスを提供し、Coherenceをmemcachedサーバーの代替として使用できるようにします。このアダプタは、memcachedバイナリ・プロトコルをサポートしているすべてのmemcachedクライアントAPIをサポートしています。これによって、様々なプログラミング言語で記述されたmemcachedクライアントがCoherenceを使用できるようになります。

memcachedアダプタはCoherenceプロキシ・サーバー上にあり、Coherence*Extendスタイルのアクセプタとして実装されています。memcachedクライアントは、クラスタ上で分散キャッシュ操作を管理するアクセプタに接続します。キャッシュ操作はエントリ・プロセッサ操作として実行されます。Coherenceでキャッシュされたデータをやり取りするために、まずアクセプタをプロキシ・サービス内で有効化する必要があります。memcachedクライアントとの通信の保護やCoherence固有のクライアントとのデータの共有を行う追加機能も提供され、必要に応じて構成できます。

図8-1は、分散キャッシュを使用するためにCoherenceプロキシ・サーバー上にあるmemcachedアクセプタに接続するmemcachedクライアントの概念図を示しています。

図8-1 memcachedクライアント接続の概念図

8.2 memcachedアダプタの設定

memcachedアダプタは、固有のmemcachedアクセプタを使用してプロキシ・サービス内で構成されます。アクセプタの構成によって、memcachedクライアントが使用するソケット・アドレスおよび分散キャッシュ定義されます。

8.2.1 memcachedアダプタ・ソケット・アドレスの定義

memcachedアダプタは、クライアントからの接続を受けるためのソケット・アドレス(IPまたはDNS名のどちらかおよびポート)を使用します。ソケット・アドレスは、オペレーション・オーバーライド構成ファイルの<address-provider要素で構成されます。その後、アドレスは構成されたid属性によってプロキシ・サービス定義から参照されます。<address-provider要素の詳細は、『Oracle Coherenceでのアプリケーションの開発』を参照してください。

次の例では、IPアドレスに198.168.1.5を、ポートに9099を、IDにmemcachedを使用してソケット・アドレスを構成しています。

...
<cluster-config>
<address-providers>
<address-provider id="memcached">
<socket-address>
<address>198.168.1.5</address>
<port>9099</port>
</socket-address>
</address-provider>
</address-providers>
</cluster-config>
...

8.2.2 memcachedアダプタ・プロキシ・サービスの定義

プロキシ・サービスによって、リモート・クライアントはクラスタ・メンバーにならずにCoherenceクラスタのキャッシュ・サービスとやり取りできます。memcachedアダプタ用のプロキシ・サービスには、定義されたソケット・アドレスでmemcachedクライアントのリクエストを受け付け、分散キャッシュにそのリクエストを委任する特定のmemcachedアクセプタが含まれています。

注意:

memcachedアダプタは、分散キャッシュのみを使用できます。

memcachedクライアント用のプロキシ・サービスを作成するには、キャッシュ構成ファイルを編集して<proxy-scheme要素を追加し、<acceptor-config要素の中に<memcached-acceptor要素を含めます。<memcached-acceptor要素には、使用するキャッシュの名前およびmemcachedクライアント通信のためにリスニングするソケット・アドレスを定義するアドレス・プロバイダ定義への参照を含める必要があります。<memcached-acceptor要素の詳細なリファレンスについては、『Oracle Coherenceでのアプリケーションの開発』を参照してください。

次の例では、プロキシ・サービスを作成し、memcachedアクセプタを定義しています。この例は、memcachedアダプタ・ソケット・アドレスの定義で定義されたアドレス・プロバイダを参照しています。

...
<caching-schemes>
<proxy-scheme>
<service-name>MemcachedProxyService</service-name>
<acceptor-config>
<memcached-acceptor>
<cache-name>hello-example</cache-name>
<address-provider>memcached</address-provider>
</memcached-acceptor>
</acceptor-config>
<autostart>true</autostart>
</proxy-scheme>
</caching-schemes>
...

キャッシュ名は、hello-exampleキャッシュを参照します。キャッシュ名は、分散キャッシュに解決する必要があります。次の例は、hello-exampleキャッシュの定義およびそれにマッピングされる分散スキームを示しています。

<?xml version="1.0"?>
<cache-config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.oracle.com/coherence/coherence-cache-config"
xsi:schemaLocation=
"http://xmlns.oracle.com/coherence/coherence-cache-config
coherence-cache-config.xsd">

<caching-scheme-mapping>
<cache-mapping>
<cache-name>hello-example</cache-name>
<scheme-name>distributed</scheme-name>
</cache-mapping>
</caching-scheme-mapping>

<caching-schemes>
<distributed-scheme>
<scheme-name>distributed</scheme-name>
<service-name>MemcachedTest</service-name>
<backing-map-scheme>
<local-scheme/>
</backing-map-scheme>
<autostart>true</autostart>
</distributed-scheme>

<proxy-scheme>
<service-name>MemcachedProxyService</service-name>
<acceptor-config>
<memcached-acceptor>
<cache-name>hello-example</cache-name>
<address-provider>memcached</address-provider>
</memcached-acceptor>
</acceptor-config>
<autostart>true</autostart>
</proxy-scheme>
</caching-schemes>
</cache-config>

8.3 memcachedアダプタへの接続

memcachedクライアントは、memcachedアダプタのプロキシ・サービスのアドレスおよびポート指定する必要があります。プロキシ・サービス・アドレスは、memcachedサーバー・アドレスのかわりに使用されます。memcachedサーバー・アドレスの指定方法の詳細は、ご使用のmemcachedクライアントのドキュメントを参照してください。

次の例は、spymemcachedクライアントAPIを使用してmemcachedアダプタの設定で定義したmemcachedアダプタ用のプロキシ・サービスに接続する単純なHello Worldクライアントを示しています。

import net.spy.memcached.AddrUtil;
import net.spy.memcached.BinaryConnectionFactory;
import net.spy.memcached.MemcachedClient;

public class MemcachedExample {
public static void main(String[] args) throws Exception {
String key = "k1";
String value = "Hello World!";

MemcachedClient c = new MemcachedClient(
new BinaryConnectionFactory(),
AddrUtil.getAddresses("198.168.1.5:9099"));

c.add(key, 0, value);
System.out.println((String)c.get(key));
c.shutdown();
}
}

8.4 memcachedクライアント通信の保護

memcachedアダプタは、認証と認可の両方を使用してクラスタ・リソースへのアクセスを制限できます。認証のサポートは、SASL (Simple Authentication and Security Layer)プレーン認証のために提供されています。認可は、Oracle Coherence*Extendスタイルの認可を使用して実装されます。これは、キャッシュ・サービスの操作に対してきめ細かいアクセス権を提供するインターセプタ・クラスに依存しています。memcachedアダプタの認証機能と認可機能はOracle Coherenceの既存のセキュリティ機能の多くを再利用しているため、可能な場合は、既存のコンテンツへの参照も提示します。

8.4.1 memcachedクライアント認証の実行

memcachedクライアントは、memcachedアダプタに接続する際にSASLプレーン認証を使用してユーザー名およびパスワードを提供できます。SASLプレーン認証を使用するには、IdentityAsserterの実装をプロキシに作成する必要があります。memcachedアダプタはIdentityAsserterの実装を呼び出し、トークンとしてcom.tangosol.net.security.UsernameAndPasswordオブジェクトを渡します。IdentityAsserterの実装の作成および有効化については、『Oracle Coherenceの保護』を参照してください。SASLプレーン接続の確立の詳細は、ご使用のmemcachedクライアントのドキュメントを参照してください。

SASLプレーン認証を使用するには、IdentityAsserterの実装に加えてmemcachedアダプタで認証を有効化する必要があります。認証を有効化するには、キャッシュ構成ファイルのプロキシ・サービス定義を編集して<memcached-acceptor>要素に<memcached-auth-method>要素を追加し、それをplainに設定します。

...
<caching-schemes>
<proxy-scheme>
<service-name>MemcachedProxyService</service-name>
<acceptor-config>
<memcached-acceptor>
<cache-name>hello-example</cache-name>
<memcached-auth-method>plain</memcached-auth-method>
<address-provider>memcached</address-provider>
</memcached-acceptor>
</acceptor-config>
<autostart>true</autostart>
</proxy-scheme>
</caching-schemes>
...

8.4.2 memcachedクライアント認可の実行

memcachedアダプタは、Oracle Coherence*Extend認可フレームワークを使用して、memcachedクライアントがクラスタで実行できる操作を制限します。Oracle Coherence*Extendスタイルの認可の実装の詳細は、『Oracle Coherenceの保護』を参照してください。

8.5 memcachedクライアントとCoherenceクライアント間のデータ共有

memcachedアダプタは、エントリをバイナリ形式でキャッシュに格納します。Coherenceクライアントとデータを共有する場合、memcachedクライアントはCoherenceクライアントもサポートしているシリアライズ形式を使用する必要があります。一般に、Coherenceクライアントはこの項で強調されているPortable Object Format (POF)を使用します。POFの詳細は、『Oracle Coherenceでのアプリケーションの開発』を参照してください。

8.5.1 memcachedクライアントのPOFの構成

memcachedクライアントのPOFを構成する手順は、次のとおりです。

1. 認証を有効化するには、キャッシュ構成ファイルのプロキシ・サービス定義を編集して<memcached-acceptor>要素に<interop-enabled>要素を追加し、それをtrueに設定します。

...
<proxy-scheme>
<service-name>MemcachedProxyService</service-name>
<acceptor-config>
<memcached-acceptor>
<cache-name>hello-example</cache-name>
<interop-enabled>true</interop-enabled>
<address-provider>memcached</address-provider>
</memcached-acceptor>
</acceptor-config>
<autostart>true</autostart>
</proxy-scheme>
...

2. memcachedアクセプタが使用する分散キャッシュでPOFを有効化します。

...
<distributed-scheme>
<scheme-name>distributed</scheme-name>
<service-name>MemcachedTest</service-name>
<serializer>
<instance>
<class-name>com.tangosol.io.pof.ConfigurablePofContext</class-name>
<init-params>
<init-param>
<param-type>String</param-type>
<param-value>memcached-pof-config.xml</param-value>
</init-param>
</init-params>
</instance>
</serializer>
<backing-map-scheme>
<local-scheme/>
</backing-map-scheme>
<autostart>true</autostart>
</distributed-scheme>

3. POFタイプを定義済のPOF構成ファイルに登録します。前述の例では、POF構成ファイルはmemcached-pof-config.xmlという名前でした。このファイルがクラスパスでcoherence.jarファイルの前に置かれている必要があります。次の例では、PofUserオブジェクト用のPOFユーザー・タイプを定義しています:

<?xml version='1.0'?>

<pof-config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.oracle.com/coherence/coherence-pof-config"
xsi:schemaLocation="http://xmlns.oracle.com/coherence/coherence-pof-config
coherence-pof-config.xsd">
<user-type-list>
<include>coherence-pof-config.xml</include>

<!-- User types must be above 1000 -->
<user-type>
<type-id>1001</type-id>
<class-name>memcached.PofUser</class-name>
</user-type>

</user-type-list>
</pof-config>

8.5.2 POFを使用するmemcachedクライアントの作成

多くのmemcachedクライアント・ライブラリには、カスタム・シリアライザをプラグインする機能が含まれています。カスタム・シリアライザのプラグイン方法の詳細は、ご使用のmemcachedクライアントのドキュメントを参照してください。次の抜粋は、手順3で登録したPofUserオブジェクトを追加し、spymemcachedトランスコーダを使用してPOFシリアライザをプラグインするspymemcachedクライアントを示しています。

MemcachedClient client = m_client;
String key = "pofKey";
PofUser user = new PofUser("memcached", 1);
PofTranscoder<PofUser> tc = new PofTranscoder("memcached-pof-config.xml");

if (!client.set(key, 0, user, tc).get())
{
throw new Exception("failed to set value");
}

POFトランスコーダ・プラグインは次のように定義されています:

import com.tangosol.io.pof.ConfigurablePofContext;
import com.tangosol.util.Binary;
import com.tangosol.util.ExternalizableHelper;

import net.spy.memcached.CachedData;
import net.spy.memcached.compat.SpyObject;
import net.spy.memcached.transcoders.Transcoder;

public class PofTranscoder<T> extends SpyObject implements Transcoder<T>
{

public PofTranscoder(String sLocator)
{
m_ctx = new ConfigurablePofContext(sLocator);
}

@Override
public boolean asyncDecode(CachedData arg0)
{
return Boolean.FALSE;
}

@Override
public T decode(CachedData cachedData)
{
int nFlag = cachedData.getFlags();
Binary bin = new Binary(cachedData.getData());
return (T) ExternalizableHelper.fromBinary(bin, m_ctx);
}

@Override
public CachedData encode(Object obj)
{

byte[] oValue = ExternalizableHelper.toByteArray(obj, m_ctx);
return new CachedData(FLAG, oValue, CachedData.MAX_SIZE);
}

@Override
public int getMaxSize()
{
return CachedData.MAX_SIZE;
}

protected ConfigurablePofContext m_ctx;

protected static final int       FLAG = 4;

オラクルの法律上の注意点について

コピーライトについて

Copyright © 1994-2016, Oracle and/or its affiliates.All rights reserved.

ライセンス制約の保証と結果的に生じる損害の免責

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

保証免責

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクルまでご連絡ください。

制限付権利について

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

危険な用途への使用について

このソフトウェアまたはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアまたはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、Oracle Corporationおよびその関連会社は一切の責任を負いかねます。

商標と登録商標について

OracleおよびJavaはオラクルおよびその関連会社の登録商標です。その他の社名、商品名等は各社の商標または登録商標である場合があります。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

第三者のコンテンツ、製品、サービスに対する免責事項

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。適用されるお客様とOracle Corporationとの間の契約に別段の定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。適用されるお客様とOracle Corporationとの間の契約に定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

アルファ版およびベータ版ドラフト・ドキュメントについて

このドキュメントが試作版の場合:

このドキュメントは試作版であり、デモおよび暫定使用のみを目的としたものです。このソフトウェアを使用するハードウェアに限定するものではありません。Oracle Corporationおよびその関連会社は、このドキュメントに関して一切の責任を負わず、いかなる保証もいたしません。また、このドキュメントを使用したことによって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。

非公開のアルファ版およびベータ版ドラフト・ドキュメントについて

このドキュメントが非公開の試作版の場合:

このドキュメントに含まれる情報は、情報の共有のみを目的としたものであって、顧客諮問委員会(Customer Advisory Board)のメンバーとしてのお客様の立場でのみ、またはお客様のベータ・トライアル契約のみに従って検討されるべきものとします。マテリアル、コード、または機能の提供をお約束するものではなく、購入決定を行う際の判断材料とすべきではありません。このドキュメントに記載されている特徴または機能の開発、リリースおよび時期については、オラクルの裁量により決定されます。

このドキュメントには、ソフトウェアまたは印刷物などの形式を問わず、オラクルが独占的な権利を有する財産的情報が含まれています。この機密資料へのアクセスと使用は、お客様とオラクルとの間で締結され、お客様が遵守に同意した、Oracle Master Agreement、Oracle License and Oracle Services Agreement (オラクル・ライセンスおよびサービスに関する契約書)、Oracle PartnerNetwork Agreement、Oracle Distribution Agreementまたはその他のライセンス契約の条件に従うものとします。このドキュメントとその内容の開示、コピー、複製および配布には、オラクルによる事前の承諾を必要とします。このドキュメントはライセンス契約の一部となるものではなく、オラクルおよびその子会社や関連会社との契約を構成するものではありません。

ドキュメントのアクセシビリティについて

オラクルのアクセシビリティについての詳細情報は、Oracle Accessibility ProgramのWebサイトhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc を参照してください。

Oracle Supportへのアクセス

サポートをご契約のお客様には、My Oracle Supportを通して電子支援サービスを提供しています。詳細情報はhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=infoか、聴覚に障害のあるお客様はhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=trsを参照してください。