第22章 キャッシュ
ほぼすべてのエンタープライズアプリケーションで主要なボトルネックとなるのがデータベースであり、 ランタイム環境で最も拡張性に乏しい層であるため、 データベースへのアクセス回数を低減するためにできることはすべてアプリケーションパフォーマンスの飛躍的な向上につながります。
適切に設計された Seam アプリケーションでは次のように何層にもわたる豊富なキャッシング戦略を実現し、 アプリケーションのすべての層で利用することができるようになっています。
- データベース用のキャッシュを持っています。これは非常に重要ですが、アプリケーション層のキャッシュのような拡張性はありません。
- ORM ソリューション (Hibernate または別の JPA 実装) で提供されるデータベースの 2 次データキャッシュがあります。 クラスタ環境でキャッシュデータをデータベースおよびその他のクラスタの両方とトランザクション的な永続性を持たせるのは、 効率的な実装を行うという点で非常にコスト高となる場合があります。 したがって、 この 2 次キャッシュにはほとんど更新されることがないデータを格納するための使用と多くのユーザーとの共有に最適となります。 従来のステートレスなアーキテクチャでは、この空間は対話的な状態の保存によく使用されます (非効率的)。
- 対話状態のキャッシュとなる Seam の対話コンテキストです。対話コンテキスト内のコンポーネントは、 現在のユーザーのインタラクションに関連した状態を保持します。
- Seam 管理永続コンテキストは現在の対話に読み込まれたデータのキャッシュとして動作します (対話スコープのステートフルセッション Bean に関連付けられた EJB コンテナ管理の永続コンテキストを、Seam 管理永続コンテキストの代わりに使用することが可能です)。Seam によりクラスタ環境で Seam 管理永続コンテキストの複製が最適化され、楽観的ロック機能によりデータベースに一貫性のあるトランザクションを提供します。1 つの永続コンテキストに何千ものオブジェクトを読み込まない限り、このキャッシュによるパフォーマンスに及ぶ影響は最小限となります。
- Seam のアプリケーションコンテキストを使用するとトランザクションでない状態をキャッシュすることができます。 ここに保持される状態はクラスタ内の他のノードからは見えません。
- アプリケーション内の Seam
cacheProviderコンポーネントは、JBossCache または Ehcache を Seam 環境に統合します。キャッシュがクラスタモード内での実行をサポートする場合は、ここに保持される状態は他のノードにも見えます。 - 最後に、 レンダリングされた JSF ページの断片をキャッシュすることができます。 ORM の 2 次キャッシュと違い、 データが更新されたときに自動的に無効にはならないため、 明示的に無効化するアプリケーションコードを書くか、 適切な有効期限ポリシーを設定する必要があります。
2 次キャッシュは非常に複雑な概念ですので、詳細はお使いの ORM ソリューションのドキュメントを参照してください。 本項では
cacheProvider コンポーネントを使用し直接キャッシュを行う方法、 または <s:cache> コントロールを使用し保存されたページ断片としてキャッシュする方法について説明します。
22.1. Seam でのキャッシュの使用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
組み込みの
cacheProvider コンポーネントは以下のインスタンスを管理します。
- JBoss Cache 3.2.x
org.jboss.cache.Cache- EhCache
net.sf.ehcache.CacheManager
キャッシュ内に配置される不変の Java オブジェクトはすべてそこに格納され、 クラスタ全体に渡り複製されます (複製に対応しかつ有効な場合)。 変更可能なオブジェクトをキャッシュに持つためには、使用するキャッシュプロジェクトの関連文書を読み、格納されたオブジェクトに加えられたキャッシュの変更を通知する方法を調べてください。
cacheProvider を使うには、 プロジェクトにキャッシュ実装に関する JAR を含ませる必要があります。
- JBoss Cache 3.2.x
jbosscache-core.jar— JBoss Cache 3.2.xjgroups.jar— JGroups 2.6.x
- Ehcache
ehcache.jar— Ehcache 1.2.3
Seam の
EAR デプロイメントでは、キャッシュ JAR と設定は直接 EAR に行くことが推奨されます。
また、JBossCache を使う場合は設定ファイルが必要となります。適切なキャッシュ設定を持つ
cache-configuration.xml をクラスパスに置きます。例えば、EJB JAR または WEB-INF/classes です。JBossCache の設定に関する詳細は、JBossCache の文書を参照してください。
サンプルの
cache-configuration.xml は examples/blog/resources/META-INF/cache-configuration.xml にあります。
Ehcache は設定ファイルがなくてもデフォルト設定で動作します。
使用中の設定ファイルを変更するには、
components.xmlでキャッシュの設定を行います。
これでいずれの Seam コンポーネントにもキャッシュをインジェクトすることができます。
アプリケーションに使用できるキャッシュを複数設定する場合は、
components.xml を使用して複数のキャッシュプロバイダを設定します。