TopLink GridはTopLink JPA実装(EclipseLink)とOracle Coherenceとを統合するもので、2つの開発アプローチを提供します。
Coherence APIをTopLink Gridのキャッシュとともに使用すると、JPAのCacheLoader
およびCacheStore
実装を持つリレーショナル・データにアクセスできます。このような従来型のCoherenceのアプローチにおいては、TopLink Gridが、EclipseLink JPA用に最適化されたCacheLoader
およびCacheStore
実装を提供します。
このアプローチの詳細は、「従来型のCoherenceの構成」およびCoherenceの統合ガイドを参照してください。
また、JPAを使用してアプリケーションを構築し、スケーラビリティとパフォーマンスを向上させるためにデータ・グリッドの機能を透過的に活用することもできます。このような「グリッド基盤のJPA」アプローチにおいては、TopLink Gridが、キャッシュのセットと、EclipseLink JPAでのCoherenceの使用方法を制御できる問合せ構成オプションを提供します。
Coherenceを分散共有キャッシュとして構成することも、Coherenceをプライマリ・データ・ストアとして使用することもできます。また、データベースのかわりにCoherenceデータ・グリッド内で問合せを実行するようエンティティを構成することもできます。これにより、クラスタ・アプリケーションのデプロイメントで、通常のデータベース操作の限界を超えるスケーラビリティが得られます。
このアプローチの詳細は、「「グリッド基盤のJPA」構成」およびCoherenceの統合ガイドを参照してください。
JPAアプリケーションをCoherenceのデータ・グリッドと統合する際は、可能性のあるメリットと制限事項に注意する必要があります。あらゆる可能性を理解するためには、グリッドの動作およびグリッドとJPA構成との関連性について理解する必要があります。
この項では、次の構成オプションについて説明します。
EclipseLinkには、デフォルトでEntityManagerFactory
管理の共有エンティティ・キャッシュが備わっています。この共有キャッシュにより、単一のJVM内で稼働する、Java EEサーバーがホストするマルチスレッド・アプリケーションのパフォーマンスを向上させることができます。
TopLink Gridを使用すると、デフォルトのEclipseLink共有(L2)キャッシュをCoherenceに置き換えることができます。これにより、クラスタ・ノード全体にわたって非常に大きな共有グリッド・キャッシュがサポートされ、各共有キャッシュが調整されていることを確認するための追加構成を行う必要がなくなります。エンティティをCoherence内にキャッシュされるグリッドとして構成すると、そのエンティティに対するEntityManager.find()
コールはすべて、関連付けられたCoherenceキャッシュに対するget
となります。Coherenceにオブジェクトが含まれていない場合は、データベースが問合せされます。
詳細は、「グリッド・キャッシュ」を参照してください。
グリッド・キャッシュ構成以外にも、読取り問合せをCoherenceに送るようTopLink Gridを構成できます。TopLink JPAのCacheLoader
を構成すると、キャッシュ・ヒットがない場合でもオブジェクトをデータベースから読み取ってキャッシュに挿入することができるので、以降の問合せでそのオブジェクトが使用可能になります。Coherenceでは非常に多数のオブジェクトを管理できるため、1つのクラスタ・メンバー内での読取りが他のメンバーに対して即時利用可能になるたびに、キャッシュ・ヒットの確率が高くなります。
Coherenceを使用してエンティティ・グリッド・キャッシュをグリッド全体に分散させることが効果的である一方で、非主キー問合せに対するサポートは特にメリットがあります。エンティティをグリッド読取りとして構成すると、すべての読取りがCoherenceに送られます。JPQL問合せは自動的にCoherenceフィルタに変換され、フィルタに一致するオブジェクトがグリッドから取得されます。Coherenceは、すべてのフィルタを各クラスタ・メンバーでパラレルに実行します。したがって、すべてのオブジェクトが1つのメンバー内に存在する場合と比較すると、問合せの処理速度が大幅に速くなります。
フィルタはCoherenceキャッシュ内のオブジェクトにのみ適用されるため、CacheStore
またはCacheLoader
が非定型の問合せ処理に影響を与えることはありません。この構成では、デフォルトで問合せはデータベースに対して実行されません。ただし、次の例に示すように、oracle.eclipselink.coherence.integrated.querying.IgnoreDefaultRedirector
クラスを使用して、この動作を問合せヒントによってオーバーライドすることはできます。
query.setHint(QueryHints.QUERY_REDIRECTOR, new IgnoreDefaultRedirector());
これにより、問合せはCoherenceキャッシュではなくデータベースに送られます。
EclipseLink JPAの問合せヒントの使用方法の詳細は、EclipseLinkのドキュメントを参照してください。
エンティティをデータベースに書き込む方法を指定しているのは、別のキー構成オプションです。次のようにEclipseLinkを構成できます。
エンティティを直接データベースに書き込んでからCoherenceに挿入します(データベースの状態を反映させます)。
または
エンティティをCoherenceに挿入してから、CoherenceでCacheStore
を使用してデータベースへの書込みを行います。
CacheStore
メソッドは、非同期データベース書込みを可能にするCoherenceのライトビハインド機能をサポートしています。このアプリケーションを使用すると、データベースが戻るのを待たずに処理を続行できます。
ただし、この構成にはいくつかの制限事項があります。たとえば、JTA統合やその他のEclipseLinkパフォーマンス機能(バッチ書込み、パラメータ・バインディング、ストアド・プロシージャ、文の順序付けなど)を使用できないことなどです。