Middleware
Application Server
How-Toドキュメント
11g(11.1.1.0.0)
September 2008
このHow-Toドキュメントを読むと以下のことができます。
" Oracle TopLink GridにおけるOracle Coherenceの共有L2キャッシュ構成の目的を理解する
" TopLinkのJPAエンティティを構成して、すべての読取り問合せをデータベースに送って結果をCoherenceキャッシュ内に格納する。
" TopLinkのJPAエンティティを構成して、すべての書込み問合せをデータベースへ送ってからCoherenceのキャッシュを更新する
TopLink GridのCoherence共有L2キャッシュ構成では、CoherenceをTopLink L2(共有)キャッシュとして使用します。これにより、これまでデータベースでホストするデータに依存し、さまざまな理由からCoherenceのキャッ シュへすべて事前ロードできなかったJPAアプリケーションにおいて、Coherenceのデータ・グリッドと同じ機能を実現できるようになります。事前 ロードできない理由には、Coherenceフィルタの機能セットの能力を超えた非常に複雑な問合せであること、サード・パーティのデータベースによる更 新で古いキャッシュが作成されてしまうこと、ネイティブSQL問合せやストアド・プロシージャ、またはトリガーなどに依存することなどが挙げられます。
CoherenceをL2キャッシュとして使用すると、TopLinkを大規模なクラスタ構成に拡張しながら、ローカルL2キャッシュとの調整を回 避できるようになります。エンティティが更新された直後から、トランザクションのコミット時にはCoherenceのすべてのクラスタ・メンバーでエン ティティを提供できます。
Coherenceの共有L2キャッシュ構成において、主キー問合せ 以外のデータベース に対するすべての読取り問合せは、まずCoherenceのキャッシュに対して実行されます。キャッシュが存在しない場合は、データベース問合せとなりま す。
データベースで問い合わせるすべてのエンティティは、Coherenceキャッシュ内に格納されています。よって、クラスタのすべてのメンバーはす ぐにエンティティを利用できます。これは、デフォルトでTopLinkがL2キャッシュを活用してデータベース結果から新規エンティティを構築しないで済 むことから、有益な仕組みとなります。
問合せで返された各行については、TopLinkがその結果行の主キーを使ってL2キャッシュから関連するエンティティを検索します。キャッシュ内 にエンティティが存在すれば、そのエンティティを使用します。新たにエンティティは構築されません。このアプローチでは、とくにキャッシュ・ウォーミング によって問合せのコストを大幅に削減できることから、アプリケーションのパフォーマンスを大きく改善します。
Coherenceの共有L2キャッシュ構成において、TopLinkはすべてのデータベース書込み(挿入、更新、削除)を実行します。その後、 Coherenceのキャッシュはデータベースへの変更を反映するよう更新されます。TopLinkは、大量のデータを書き込む際にいくつかのパフォーマ ンス機能を提供します。たとえば、バッチの書込み、パラメータのバインド、ストアド・プロシージャのサポート、および文の命令があり、データベースの制約 に合致することを保証します。
CoherenceのL2キャッシュ構成では、
CoherencInterceptorを使ってエンティティを構成でき ます。このクラスは、内部TopLinkのL2キャッシュに対するTopLinkのすべてのコールを遮断し、Coherenceへリダイレクトします。
import oracle.eclipselink.coherence.integrated.cache.CoherenceInterceptor;
import org.eclipse.persistence.annotations.Customizer;
@Entity
@CacheInterceptor(value = CoherenceInterceptor.class)
public class Employee {
...
}
次の例で、Coherenceの共有L2キャッシュ構成を使用する方法を示します。
Coherenceから特定のID(キー)を使ってエンティティを取得する場合、
em.find(Entity.class, ID)を 使用します。ここでは、特定のIDをもった従業員を検索します。
private Employee employeeFind(EntityManager em, int id) {
Employee employee = null;
employee = em.find(Employee.class, id);
return employee;
}
たとえば、
em.find(Employee.class, 8)は
8と いうキーをもったオブジェクトをCoherence
Employeeのキャッシュから取得しま す。
Coherenceのキャッシュ内にエンティティがない場合、TopLinkはデータベースに対して
SELECT文を実 行します。結果が検索された場合は、エンティティが構築され、Coherence内に格納されます。
特定の選択条件に一致するエンティティを取得する場合、
em.createQuery("...")を使用します。ここ では、特定の名前をもつ従業員を検索します。
private Employee employeeFind(EntityManager em, String name) {
Employee employee = (Employee)em
createQuery("select e from Employee e where e.name = :name")
setParameter("name", name)
getSingleResult();
return employee;
}
たとえば、
em.createQuery("select e from Employee e where e.name='John'")は、データベースに対してSELECT文を実行し、
Johnと いう
名前の従業員を検索します。
SELECT文がデータベース結果を返すとその主キーが抽出され、すでにCoherenceが関連するエンティティを保 持しているか確認します。
デフォルトでは、Coherence内にエンティティが 存在する場合、データ ベース結果は破棄されて、キャッシュ済みのエンティティが使用されます。
Coherence内にエンティティが 存在しない場合、データベース結果から新 しいエンティティが構築されてCoherence内に格納されます。
Coherenceのキャッシュに対してエンティティを永続化させるには、
em.persist(Object)を使用 します。ここでは、新しい従業員を追加します。
private void EmployeeAdd(EntityManager em, String name) {
Employee employee = new Employee(name);
em.getTransaction().begin();
em.persist(employee);
em.getTransaction().commit();
}
たとえば、サンプルの
employeeAddメソッドをパラメータの
John (
employeeAdd(em, "John"))で呼び出すと、コミット時にTopLinkが
INSERT文 を実行し、データベースにオブジェクトの
Johnを追加します。
データベース・トランザクションが成功すると、新しいエンティティがCoherence Employeeの キャッシュ内の主キー下に格納されます。
データベースにオブジェクトを更新してからCoherenceキャッシュ内に更新オブジェクトを挿入するには、
em.merge(Object)を 使用します。ここでは、特定のIDをもつ従業員を検索し、従業員の名前を変更します(ここでは簡潔さを優先してエラー・チェックは省略します)。トランザ クションがコミットされると、Coherenceは更新されます。
private void employeeRename(EntityManager em, int id, String newName) {
Employee employee = employeeFind(em, id);
employee.setName(newName);
em.getTransaction().begin();
em.merge(employee);
em.getTransaction().commit();
}
この例では、管理された従業員の名前を変更しました(ここでも同様に簡潔さを優先してエラー・チェックは省略します)。トランザクションがコミット されると、Coherenceは更新されます。
private void employeeRename(EntityManager em, int id, String newName) {
em.getTransaction().begin();
Employee employee = employeeFind(em, id);
employee.setName(newName);
em.getTransaction().commit();
}
たとえば、サンプルの
employeeRename(em, 8, "John")メソッドでいずれかを呼び出すと、 TopLinkは主キー下でCoherenceのキャッシュ内に更新オブジェクトを挿入し、古いオブジェクトと置き換えます。
一般的に、Coherenceの共有L2キャッシュ構成は以下のようにまとめられます。
主キー問合せは、最初にCoherenceからエンティティの取得を試みます。失敗した場合、データベースに問合せを送り、問合せ結果に基 づきCoherenceを更新します。
主キー以外の問合せはデータベースに対して実行され、キャッシュ済みのエンティティと重複してオブジェクトを構築しないよう、 Coherenceと比較されます。新しく問い合わせのあったエンティティは、Coherence内に挿入されます。
データベースは書込み操作により更新され、コミットが成功すると、更新済みエンティティはCoherence内に挿入されます。
この機能のおもなクラスは、
oracle.eclipselink.coherence.integrated.config.CoherenceInterceptorパッ ケージ内にあります。
オラクルは、製品、サービス、およびサポート・ドキュメントを障害のあるお客様にも簡単に使用していただくことを目標にしています。そのため、当社 のドキュメントには、アシスティブ・テクノロジーを使用するお客様に情報を提供する機能が含まれています。このドキュメントは、HTML形式で提供されて おり、障害のあるお客様が簡単にアクセスできるためのマークアップが含まれています。アクセシビリティの標準は進化し続けており、オラクルは当社のドキュ メントをすべてのお客様が利用できるように、市場をリードする他の技術ベンダーと積極的に関与して技術的な問題に対処しています。詳しくは、Oracle Accessibility ProgramのWebサイトで、
http://www.oracle.com/accessibility/
を 参照してください。
ドキュメント内のサンプル・コードのアクセシビリティ
スクリーン・リーダーは、ドキュメント内のサンプル・コードを常に正しく読み取るとは限りません。コード表記規則では、右中括弧は別の空の行へ記す 必要があります。ただし、スクリーン・リーダーによっては、括弧または中括弧のみを含むテキスト行を読み取らない場合があります。
ドキュメント内の外部Webサイトへのリンクのアクセシビリティ
このドキュメントには、オラクルが所有または管理しない他の企業または組織のWebサイトへのリンクが含まれる場合があります。オラクルは、それら のWebサイトのアクセシビリティに関する評価や言及はおこないません。
Oracleサポート・サービスへのTTYアクセス
オラクルは、米国内では年中無休で24時間、Oracleサポート・サービスへのテキスト電話(TTY)アクセスを提供しています。TTYサポート へは、800-446-2398へお電話ください。米国外からは、+1-407-458-2479へお電話ください。
Oracle TopLink How-Toドキュメント、11g(11.1.1.0.0)
Copyright © 2007, 2008 Oracle. All rights reserved.
このプログラム(ソフトウェアおよびドキュメントを含む)には、オラクル社およびその関連会社に所有権のある情報が含まれています。このプログラム の使用または開示は、オラクル社およびその関連会社との契約に記された制約条件に従うものとします。著作権、特許権およびそのほかの知的財産権と工業所有 権に関する法律により保護されています。独立して作成された他のソフトウェアとの互換性を得るために必要な場合、もしくは法律によって規定される場合を除 き、このプログラムのリバース・エンジニアリング、逆アセンブル、逆コンパイル等は禁止されています。
本文書に記載された内容は、予告なく変更されることがあります。本文書内に問題が見つかった場合は、書面にて報告してください。オラクル社およびそ の関連会社は、本文書に一切間違いがないことを保証するものではありません。これらのプログラムのライセンス契約において明確に許諾されている場合を除い て、いかなる形式、手段(電子的または機械的)、目的のためにも、これらのプログラムを複製または転用することはできません。
このプログラムがアメリカ政府またはプログラムのライセンスを受け、使用するアメリカ政府の代理人に提供される場合は、以下の注意事項を適用しま す。
U.S. GOVERNMENT RIGHTS Programs, software, databases, and related documentation and technical data delivered to U.S. Government customers are "commercial computer software" or "commercial technical data" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations. As such, use, duplication, disclosure, modification, and adaptation of the Programs, including documentation and technical data, shall be subject to the licensing restrictions set forth in the applicable Oracle license agreement, and, to the extent applicable, the additional rights set forth in FAR 52.227-19, Commercial Computer Software--Restricted Rights (June 1987). Oracle USA, Inc., 500 Oracle Parkway, Redwood City, CA 94065.
このプログラムは、核、航空産業、大量輸送、医療あるいはそのほかの危険が伴うアプリケーションへの用途を目的としておりません。このプログラムを かかる目的で使用する際、上述のアプリケーションを安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、そのほかの対 策を講じることはライセンシーの責任となります。万一かかるプログラムの使用に起因して損害が発生いたしましても、オラクル社およびその関連会社は一切責 任を負いかねます。
Oracle、JD Edwards、PeopleSoft、およびSiebelは、米国Oracle Corporationおよびその子会社、関連会社の登録商標です。他の製品名は、それぞれの所有者の商標です。
このプログラムは、第三者のWebサイトへリンクし、第三者のコンテンツ、製品、サービスへアクセスすることがあります。オラクル社およびその関連 会社は第三者のWebサイトで提供されるコンテンツについては、一切の責任を負いかねます。当該コンテンツの利用は、お客様の責任になります。第三者の製 品またはサービスを購入する場合は、第三者と直接の取引となります。オラクル社およびその関連会社は、(a)第三者の製品およびサービスの品質、(b)購 入製品またはサービスに関連する第三者との契約のいかなる条項の履行(製品またはサービスの提供、保証義務を含む)に関しても責任を負いかねます。また、 第三者との取引により損失や損害が発生いたしましても、オラクル社およびその関連会社は一切の責任を負いかねます。