20.2. JBoss Cache による分散キャッシング

JBoss Cache は、 アプリケーションサーバー環境やスタンドアローンで使用できるフル機能の分散キャッシュフレームワークです。 JBoss Cache は、 以下を含む JBoss Enterprise Application Platform クラスターの多くの標準クラスター化サービスが使用する基礎の分散キャッシングサポートを提供します。
  • クラスター化された Web アプリケーションセッションのレプリケーション
  • クラスター化された EJB3 ステートフルセッション Bean のレプリケーション
  • JPA および Hibernate エンティティのクラスター化されたキャッシング
  • クラスター化されたシングルサインオン
  • HA-JNDI レプリケートツリー
  • DistributedStateService
アプリケーションのカスタム使用のために独自の JBoss Cache インスタンスや POJO Cache インスタンスを作成することもできます。 詳細は、 28章JBoss Cache の設定とデプロイメント を参照してください。

20.2.1. JBoss Enterprise Application Platform の CacheManager サービス

JBoss Enterprise Application Platform の標準のクラスター化されたサービスの多くは JBoss Cache を使用してクラスタ全体で一貫的なステートを維持します。 異なるサービス (Web セッションクラスタリングや JPA/Hibernate エンティティの 2 次レベルキャッシングなど) は異なる JBoss Cache インスタンスを使用し、 各キャッシュは使用するサービスに合わせて設定されます。 Enterprise Application Platform 4 では、 各キャッシュが個別に deploy/ ディレクトリへデプロイされたため、 次のような欠点がありました。
  • エンドユーザーが必要ないキャッシュもデプロイされ、 各キャッシュが JGroup チャネルを作成しました。 例えば、 クラスター化された EJB3 SFSB がなくても、 保存されるキャッシュが開始されました。
  • キャッシュはキャッシュを使用するサービスの内部的な詳細であるため、 ファーストクラスのデプロイメントとするべきではありません。
  • サービスは JMX ルックアップよりキャッシュを検索するのですが、管理インターフェースを公開する目的以外で JMX を使用することは、JBoss Enterprise Application Platform 5 の方針に反します。
JBoss Enterprise Application Platform 5 では、散在するキャッシュデプロイメントが、$JBOSS_HOME/server/production/deploy/cluster/jboss-cache-manager.sar よりデプロイされる新しい CacheManager サービスに置き換えられました。 CacheManager はファクトリで、JBoss Cache インスタンスのレジストリです。 キャッシュが必要なサービスは、 名前を用いてキャッシュマネージャーにキャッシュを要求します。 キャッシュマネージャがキャッシュを作成し (キャッシュが作成されていなかった場合)、返します。キャッシュマネージャーは作成したキャッシュの参照を保持するため、 同じキャッシュ設定名をリクエストするすべてのサービスが同じキャッシュを共有します。 サービスは使用を終えたキャッシュをキャッシュマネージャーに解放します。 キャッシュマネージャは各キャッシュを使用するサービスの数を把握し、すべてのサービスがキャッシュを解放した後にキャッシュを停止し破棄します。

20.2.1.1. 標準のキャッシュ設定

次の標準 JBoss Cache 設定が JBoss Enterprise Application Platform 5 に同梱されます。 ニーズに合わせて別の設定を追加するか、これらの設定を編集してキャッシュの動作を調整することができます。 追加や変更を行うには、 deploy/cluster/jboss-cache-manager.sar/META-INF/jboss-cache-manager-jboss-beans.xml ファイルを編集します (詳細は 「CacheManager サービスによるデプロイメント」 を参照)。 ただし、 これらの設定は使用目的に合わせて最適化されているため、 本ガイドの各サービスに対する章に明確に説明がない限り、 変更しない方がよいでしょう。
  • standard-session-cache
    Web セッションに使用される標準のキャッシュです。
  • field-granularity-session-cache
    FIELD 粒度の Web セッションに使用される標準のキャッシュです。
  • sfsb-cache
    EJB3 SFSB キャッシングに使用される標準のキャッシュです。
  • ha-partition
    Web の階層のクラスター化されたシングルサインオン、 HA-JNDI、 分散ステートによって使用されます。
  • mvcc-entity
    JBoss Cache の MVCC ロッキングを使用する JPA/Hibernate エンティティ/コレクションキャッシングに適切な設定です (下記の注記を参照)。
  • optimistic-entity
    JBoss Cache の楽観的ロッキングを使用する JPA/Hibernate のエンティティ/コレクションキャッシングに適切な設定です (下記の注記を参照)。
  • pessimistic-entity
    JBoss Cache の悲観的ロッキングを使用する JPA/Hibernate のエンティティ/コレクションキャッシングに適切な設定です (下記の注記を参照)。
  • mvcc-entity-repeatable
    「mvcc-entity」と同じですが、READ_COMMITTED ではなく JBoss Cache の REPEATABLE_READ 分離レベルを使用します (下記の注記を参照)。
  • pessimistic-entity-repeatable
    「pessimistic-entity」と同じですが、READ_COMMITTED ではなく JBoss Cache の REPEATABLE_READ 分離レベルを使用します (下記の注記を参照)。
  • local-query
    JPA/Hibernate のクエリ結果のキャッシングに適切な設定です。 クエリの結果はレプリケートしません。 このキャッシュのクエリ結果が有効であるかを検証するために Hibernate が使用するタイムスタンプデータを保存しないでください。
  • replicated-query
    JPA/Hibernate のクエリ結果のキャッシングに適切な設定です。 クエリの結果をレプリケートします。 このキャッシュのクエリ結果が有効であるかを検証するために Hibernate が使用するタイムスタンプデータを保存しないでください。
  • timestamps-cache
    JPA/Hibernate のクエリ結果キャッシングの一部としてキャッシュされるタイムスタンプデータに適切な設定です。 クエリ結果自体が local-query のような非リプリケーションキャッシュを使用する場合でも、 クエリ結果キャッシングが使用される時はレプリケートされたタイムスタンプのキャッシュが必要となります。 
  • mvcc-shared
    JPA/Hibernate のエンティティ、コレクション、クエリ結果、タイムスタンプキャッシングで共有されるキャッシュに適切な設定です。最も非効率なモードである REPL_SYNC キャッシュモードが必要となるため、推奨される設定ではありません。 また、 起動時にフルステート転送が必要となるため、高価になることがあります。JBoss 4 では共有キャッシュのみが使用できたため、後方互換性を理由に維持されています。JBoss Cache の MVCC ロックを使用します。
  • optimistic-shared
    JPA/Hibernate のエンティティ、コレクション、クエリ結果、タイムスタンプキャッシングで共有されるキャッシュに適切な設定です。最も非効率なモードである REPL_SYNC キャッシュモードが必要となるため、推奨される設定ではありません。 また、起動時にフルステート転送が必要となるため、高価になることがあります。 JBoss 4 では共有キャッシュのみが使用できたため、後方互換性を理由に維持されています。JBoss Cache の 楽観的ロックを使用します。
  • pessimistic-shared
    JPA/Hibernate のエンティティ、 コレクション、 クエリ結果、 タイムスタンプキャッシングで共有されるキャッシュに適切な設定です。 最も非効率なモードである REPL_SYNC キャッシュモードが必要となるため、 推奨される設定ではありません。 また、 起動時にフルステート転送が必要となるため、高価になることがあります。 JBoss 4 では共有キャッシュのみが使用できたため、後方互換性を理由に維持されています。JBoss Cache の悲観的ロックを使用します。
  • mvcc-shared-repeatable
    「mvcc-shared」と同じですが、READ_COMMITTED ではなく JBoss Cache の REPEATABLE_READ 分離レベルを使用します (下記の注記を参照)。
  • pessimistic-shared-repeatable
    「pessimistic-shared」と同じですが、 READ_COMMITTED ではなく JBoss Cache の REPEATABLE_READ 分離レベルを使用します (下記の注記を参照)。

注記

JBoss Cache のロッキングスキームに関する詳しい情報は 「並行アクセス」 を参照してください。

注記

JPA/Hibernate の 2 次レベルキャッシングでは、 アプリケーションがE ntityManager/Hibernate セッションからエンティティを追放または削除し、 同じトランザクション内で繰り返し再度読み取りする場合のみ REPEATABLE_READ が有用です。 そうでない場合、 セッションの内部キャッシュが repeatable-read のセマンティックを提供します。

20.2.1.2. キャッシュ設定エイリアス

キャッシュの登録名以外の名前でルックアップできるようにするなど、 CacheManager はキャッシュのエイリアスもサポートします。 エイリアスは、 異なるキャッシュ設定名が設定されているサービス間でキャッシュを共有するのに便利です。 また、 Enterprise Application Platform 4 よりポートされるレガシー EJB3 アプリケーション設定のサポートにも便利です。
エイリアスは jboss-cache-manager-jboss-beans.xml ファイルの 「CacheManager Bean」 を編集して設定することができます。 次の設定は、 Enterprise Application Platform 5 の標準的なエイリアスになります。
<bean name="CacheManager" class="org.jboss.ha.cachemanager.CacheManager">

    . . .

    <!-- Aliases for cache names. Allows caches to be shared across 
         services that may expect different cache configuration names. -->
    <property name="configAliases">
       <map keyClass="java.lang.String" valueClass="java.lang.String">
          <!-- Use the HAPartition cache for ClusteredSSO caching -->
          <entry>
             <key>clustered-sso</key>
             <value>ha-partition</value>
          </entry>
          <!-- Handle the legacy name for the EJB3 SFSB cache -->
          <entry>
             <key>jboss.cache:service=EJB3SFSBClusteredCache</key>
             <value>sfsb-cache</value>
          </entry>
          <!-- Handle the legacy name for the EJB3 Entity cache -->
          <entry>
             <key>jboss.cache:service=EJB3EntityTreeCache</key>
             <value>mvcc-shared</value>
          </entry>
       </map>
    </property>
    
    . . .
    
</bean>