この章では、Coherenceキャッシュ構成のデプロイメント・ディスクリプタを使用してアプリケーションが使用するキャッシュを定義および構成する方法について詳しく説明します。キャッシュ構成デプロイメント・ディスクリプタのすべての使用可能な要素の完全なリファレンスについては、付録B「キャッシュ構成の要素」を参照してください。また、様々なサンプルのキャッシュの構成については、第18章「キャッシュの構成例」を参照してください。
この章には次の項が含まれます:
キャッシュは、Coherenceキャッシュ構成デプロイメント・ディスクリプタで構成されます。デフォルトでは、クラスパスで最初に検出されたcoherence-cache-config.xml
デプロイメント・ディスクリプタ・ファイルがロードされます。Coherenceのcoherence.jar
ライブラリには、サンプルのcoherence-cache-config.xml
ファイルがあります。別のcoherence-cache-config.xml
ファイルを使用するには、そのファイルをクラスパスに配置し、coherence.jar
ライブラリの前にそのファイルがロードされるようにする必要があります。そうしないと、サンプルのキャッシュ構成デプロイメント・ディスクリプタが使用されます。キャッシュ構成デプロイメント・ディスクリプタを指定するためのその他の方法については、「キャッシュ構成ファイルの指定」を参照してください。
キャッシュ構成ディスクリプタでは、アプリケーション・コードに依存せずにキャッシュを定義できます。実行時に、アプリケーションではディスクリプタで定義された名前を使用してキャッシュを参照し、キャッシュのインスタンスを取得します。それによって、キャッシュの定義に依存することなくアプリケーション・コードを作成できるようになります。この方法では、キャッシュ定義の変更時にアプリケーション・コードを変更する必要がありません。また、キャッシュ定義の再利用性が最大限に高められます。
キャッシュ構成ディスクリプタのスキーマは、coherence-cache-config.xsd
ファイルで定義されます。このファイルにより、coherence-cache-config-base.xsd
ファイルがインポートされ、これによりさらに暗黙的にcoherence-config-base.xsd
ファイルがインポートされます。このファイルは、coherence.jar
ファイルのルートにあります。キャッシュ構成デプロイメント・ディスクリプタは、<caching-scheme-mapping>
要素と<caching-schemes>
要素という2つの主要要素で構成されます。これらの要素の詳細は、この章で後述します。これらの要素は、キャッシュ・スキームの定義、およびキャッシュ・スキームにマップされるキャッシュ名の定義に使用されます。
キャッシュ・マッピングでは、キャッシュ名がキャッシュ・スキーム定義にマップされます。このマッピングによって、アプリケーションと基礎となるキャッシュ定義が、ある程度分離されます。この分離により、アプリケーション・コードを変更せずに、キャッシュの実装を必要に応じて変更できるようになります。キャッシュ・マッピングは、基礎となるキャッシュ・スキーム定義に適用される初期化パラメータの設定にも使用できます。
また、<cache-scheme-mapping>
ノード内の<cache-mapping>
要素を使用して定義されます。キャッシュ・マッピングは必要な数だけ作成できます。キャッシュ・マッピングには、キャッシュ名とキャッシュ名のマップ先のスキーム名を含める必要があります。<cache-mappings>要素の詳細なリファレンスについては、「cache-mapping」
を参照してください。
正確なキャッシュ・マッピングでは、個別のキャッシュ名がキャッシュ・スキーム定義にマップされます。アプリケーションでキャッシュを使用するには、マッピングで指定されたとおりの名前で指定する必要があります。例13-1では、キャッシュ名example
をdistributed
というスキーム名の分散キャッシュ・スキーム定義にマップする、単一キャッシュのマッピングを作成します。
例13-1 正確なキャッシュ・マッピングのサンプル
<?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>example</cache-name> <scheme-name>distributed</scheme-name> </cache-mapping> </caching-scheme-mapping> <caching-schemes> <distributed-scheme> <scheme-name>distributed</scheme-name> </distributed-scheme> </caching-schemes> </cache-config>
名前パターン・キャッシュ・マッピングを使用すると、アプリケーションでキャッシュ名を指定する際にパターンを使用できます。パターンではアスタリスク(*)ワイルドカードを使用できます。名前パターンを使用することで、アプリケーションでキャッシュの正確な名前を認識する必要がなくなります。例13-2では、キャッシュ・マッピングを2つ作成します。最初のマッピングでは、ワイルドカード(*)を使用して、任意のキャッシュ名をdistributed
というスキーム名の分散キャッシュ・スキーム定義にマップします。2番目のマッピングでは、名前パターンaccount-*
をaccount-distributed
というスキーム名のキャッシュ・スキーム定義にマップします。
例13-2 キャッシュ名パターン・マッピングのサンプル
<?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>*</cache-name> <scheme-name>distributed</scheme-name> </cache-mapping> <cache-mapping> <cache-name>account-*</cache-name> <scheme-name>account-distributed</scheme-name> </cache-mapping> </caching-scheme-mapping> <caching-schemes> <distributed-scheme> <scheme-name>distributed</scheme-name> </distributed-scheme> <distributed-scheme> <scheme-name>account-distributed</scheme-name> </distributed-scheme> </caching-schemes> </cache-config>
最初のマッピングでは、アプリケーションでのキャッシュの作成時に任意の名前が使用可能であり、その名前がdistributed
というスキーム名のキャッシュ・スキーム定義にマップされます。2番目のマッピングでは、アプリケーションでキャッシュ名を指定する際に、パターンを使用する必要があります。この例の場合は、名前の前に接頭辞account-
を付ける必要があります。たとえば、アプリケーションでキャッシュ名としてaccount-overdue
を指定し、account-distributed
というスキーム名のキャッシュ・スキーム定義を使用します。
例13-2に示されているように、複数のキャッシュ・マッピングに一致するキャッシュ名(たとえば、account-overdue
)を持つことが可能です。このような場合、正確なキャッシュ・マッピングで定義されているものがあると、それがワイルドカードの一致よりも優先されて常に選択されます。複数のワイルドカードの一致の中で、最後に一致したワイルドカード・マッピング(ファイルで定義された順番に基づく)が選択されます。そのため、あまり限定的でないワイルドカード・パターンをファイルの先に定義し、ファイル後方のより限定的なワイルドカード・パターンでオーバーライドされるようにするのが一般的です。
キャッシュ・スキームは、アプリケーションで使用可能なキャッシュの定義に使用されます。キャッシュ・スキームによって宣言メカニズムが指定されます。これにより、キャッシュを使用するアプリケーションに依存せずにキャッシュを定義できるようになります。そのため、アプリケーションでキャッシュを定義する必要がなくなり、アプリケーションのコードを変更せずにキャッシュを変更できるようになります。キャッシュ・スキームにより、多数のアプリケーションで同一のキャッシュ定義が使用可能となり、キャッシュ定義の再利用も促進されます。
キャッシュ・スキームは<caching-schemes>
要素で定義されます。キャッシュ・タイプ(分散、レプリケートなど)ごとに、対応するスキーム要素と、そのタイプのキャッシュ定義に使用されるプロパティがあります。キャッシュ・スキームはネストも可能であり、ニア・キャッシュのように高度にカスタマイズされた複合キャッシュも使用できます。<caching-schemes>要素の詳細なリファレンスについては、「caching-schemes」
を参照してください。
この項では、最も使用頻度の高いキャッシュ・タイプのキャッシュ・スキームの定義方法を説明しますが、Coherenceで用意されているすべてのキャッシュ・タイプを網羅しているわけではありません。その他のキャッシュ・タイプのキャッシュ・スキームを定義する手順については、このガイド全体を通して、そのスキームがサポートする機能の説明の一部として記載されています。この項には次のトピックが含まれます:
<distributed-scheme>
要素は、分散キャッシュの定義に使用されます。分散キャッシュでは、分散(パーティション)キャッシュ・サービス・インスタンスを使用します。キャッシュ構成ファイルで、分散キャッシュを必要な数だけ定義できます。<distributed-scheme>要素の詳細なリファレンスについては、「distributed-scheme」
を参照してください。
例13-3では、スキーム名としてdistributed
を使用し、キャッシュ名example
にマップされる、基本的な分散キャッシュを定義します。<autostart>
要素をtrue
に設定すると、キャッシュ・サーバー・ノード上でサービスを開始します。
例13-3 分散キャッシュ定義のサンプル
<?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>example</cache-name> <scheme-name>distributed</scheme-name> </cache-mapping> </caching-scheme-mapping> <caching-schemes> <distributed-scheme> <scheme-name>distributed</scheme-name> <backing-map-scheme> <local-scheme/> </backing-map-scheme> <autostart>true</autostart> </distributed-scheme> </caching-schemes> </cache-config>
この例では、分散キャッシュによって、バッキング・マップとして使用されるローカル・キャッシュが定義されます。バッキング・マップの構成の詳細は、第14章「記憶域およびバッキング・マップの実装」を参照してください。
<replicated-scheme>
要素は、レプリケート・キャッシュの定義に使用されます。レプリケート・キャッシュでは、レプリケート・キャッシュ・サービス・インスタンスを使用します。キャッシュ構成ファイルで、レプリケート・キャッシュを必要な数だけ定義できます。<replicated-scheme>要素の詳細なリファレンスについては、「replicated-scheme」
を参照してください。
例13-4では、スキーム名としてreplicated
を使用し、キャッシュ名example
にマップされる、基本的なレプリケート・キャッシュを定義します。<autostart>
要素をtrue
に設定すると、キャッシュ・サーバー・ノード上でサービスを開始します。
例13-4 レプリケート・キャッシュ定義のサンプル
<?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>example</cache-name> <scheme-name>replicated</scheme-name> </cache-mapping> </caching-scheme-mapping> <caching-schemes> <replicated-scheme> <scheme-name>replicated</scheme-name> <backing-map-scheme> <local-scheme/> </backing-map-scheme> <autostart>true</autostart> </replicated-scheme> </caching-schemes> </cache-config>
この例では、レプリケート・キャッシュによって、バッキング・マップとして使用されるローカル・キャッシュが定義されます。バッキング・マップの構成の詳細は、第14章「記憶域およびバッキング・マップの実装」を参照してください。
<optimistic-scheme>
要素は、オプティミスティック・キャッシュの定義に使用されます。オプティミスティック・キャッシュでは、オプティミスティック・キャッシュ・サービス・インスタンスを使用します。キャッシュ構成ファイルで、オプティミスティック・キャッシュを必要な数だけ定義できます。<optimistic-scheme>要素の詳細なリファレンスについては、「optimistic-scheme」
を参照してください。
例13-5では、スキーム名としてoptimistic
を使用し、キャッシュ名example
にマップされる、基本的なオプティミスティック・キャッシュを定義します。<autostart>
要素をtrue
に設定すると、キャッシュ・サーバー・ノード上でサービスを開始します。
例13-5 オプティミスティック・キャッシュ定義のサンプル
<?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>example</cache-name> <scheme-name>optimistic</scheme-name> </cache-mapping> </caching-scheme-mapping> <caching-schemes> <optimistic-scheme> <scheme-name>optimistic</scheme-name> <backing-map-scheme> <local-scheme/> </backing-map-scheme> <autostart>true</autostart> </optimistic-scheme> </caching-schemes> </cache-config>
この例では、オプティミスティック・キャッシュによって、バッキング・マップとして使用されるローカル・キャッシュが定義されます。バッキング・マップの構成の詳細は、第14章「記憶域およびバッキング・マップの実装」を参照してください。
<local-scheme>
要素は、ローカル・キャッシュの定義に使用されます。一般にローカル・キャッシュは、別のキャッシュ・スキームにネストされます(たとえば、ニア・キャッシュのフロント層として)。このため、この要素は、<caching-schemes>
、<distributed-scheme>
、<replicated-scheme>
、<optimistic-scheme>
、<near-scheme>
、<overflow-scheme>
、<read-write-backing-map-scheme>
および<backing-map-scheme>
の各要素のサブ要素として使用できます。<local-scheme>要素の詳細なリファレンスについては、「local-scheme」
を参照してください。
例13-6では、スキーム名としてlocal
を使用しキャッシュ名example
にマップされる、ローカル・キャッシュを定義します。
注意: 一般にローカル・キャッシュは、キャッシュ・サーバー上のスタンドアロン・キャッシュとしては使用されません、また、キャッシュ構成ファイル内のキャッシュ定義がローカル・キャッシュのみの場合、クラスタリング・キャッシュ・サーバー分散は起動しません。 |
例13-6 ローカル・キャッシュ定義のサンプル
<?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>example</cache-name> <scheme-name>local</scheme-name> </cache-mapping> </caching-scheme-mapping> <caching-schemes> <local-scheme> <scheme-name>local</scheme-name> <eviction-policy>LRU</eviction-policy> <high-units>32000</high-units> <low-units>10</low-units> <unit-calculator>FIXED</unit-calculator> <expiry-delay>10ms</expiry-delay> </local-scheme> </caching-schemes> </cache-config>
Coherence*Extendを使用する場合は、『Oracle Coherenceリモート・クライアントの開発』のC++クライアント用ローカル・キャッシュの定義に関する項と.NETクライアント用ローカル・キャッシュの構成に関する項を参照してください。
表13-0に示すように、<local-scheme>
には、キャッシュの拡大を制御するためのオプションのサブ要素がいくつか用意されています。たとえば、サブ要素<low-units
>
および<high-units>
は、キャッシュのサイズを制限します。キャッシュが最大許容サイズに達すると、指定されたエビクション・ポリシー(<eviction-policy>
)に従って削除対象エントリが決定され、指定されたより小さなサイズに戻ります。エントリおよびサイズの制限は、該当するスキームの単位換算カリキュレータ(<unit-calculator>
)で計算される単位で測定されます。
ローカル・キャッシュに関しては、キャッシュ構成要素<expiry-delay>
を使用して、キャッシュに保持されていたアイテムが期限切れになるまでの時間長を構成します。クライアント・スレッドは、キャッシュへのアクセス時にこれらのアクションを開始します。そのため、<expiry-delay>
に達していても、クライアント・スレッドがキャッシュにアクセスするまではアクションが開始されません。たとえば、<expiry-delay>
値が10秒(10s
)に設定されていて、クライアントがキャッシュにアクセスするのが15秒後である場合は、15秒後に有効期限切れになります。
注意: エビクションを実行するのはクライアント・スレッドであり、バックグラウンド・スレッドではありません。さらに、expiry-delayのパラメータ(cExpiryMillis )は整数として定義し、ミリ秒単位で表します。そのため、最大期間はInteger.MAX_VALUE (2147483647)ミリ秒数を超えることはできず、おおよそ24日間になります。 |
LocalCache
クラスは、サイズの制限されたキャッシュに使用されます。これは、ヒープ上のオブジェクトのキャッシュ(ローカル・キャッシュやニア・キャッシュのフロント部分など)、およびパーティション・キャッシュのバッキング・マップの両方に使用されます。アプリケーションでは、LocalCache
で使用するカスタム・エビクション・ポリシーを指定できます。
Coherenceのデフォルトのエビクション・ポリシーは大半のワークロードに対して非常に効率的であり、ほとんどのアプリケーションでカスタム・ポリシーを提供する必要がなくなります。一般的に、エビクション・ポリシーを使用するのは、削除されたデータがバッキング・システム(ニア・キャッシュのバック部分またはデータベース)に存在する場合に限定することをお薦めします。エビクションは、論理操作(エンティティの削除)ではなく、物理操作(メモリーの解放)として扱ってください。
例13-7は、単純なカスタム・エビクション・ポリシーの実装を示しています。
例13-7 カスタム・エビクション・ポリシーの実装
package com.tangosol.examples.eviction; import com.tangosol.net.cache.AbstractEvictionPolicy; import com.tangosol.net.cache.ConfigurableCacheMap; import com.tangosol.net.cache.LocalCache; import com.tangosol.net.BackingMapManagerContext; import com.tangosol.util.ConverterCollections; import java.util.Iterator; import java.util.Map; /** * Custom eviction policy that evicts items randomly (or more specifically, * based on the natural order provided by the map's iterator.) * This example may be used in cases where fast eviction is required * with as little processing as possible. */ public class SimpleEvictionPolicy extends AbstractEvictionPolicy { /** * Default constructor; typically used with local caches or the front * parts of near caches. */ public SimpleEvictionPolicy() { } /** * Constructor that accepts {@link BackingMapManagerContext}; should * be used with partitioned cache backing maps. * * @param ctx backing map context */ public SimpleEvictionPolicy(BackingMapManagerContext ctx) { m_ctx = ctx; } /** * {@inheritDoc} */ public void entryUpdated(ConfigurableCacheMap.Entry entry) { } /** * {@inheritDoc} */ public void entryTouched(ConfigurableCacheMap.Entry entry) { } /** * {@inheritDoc} */ public void requestEviction(int cMaximum) { ConfigurableCacheMap cache = getCache(); Iterator iter = cache.entrySet().iterator(); for (int i = 0, c = cache.getUnits() - cMaximum; i < c && iter.hasNext(); i++) { ConfigurableCacheMap.Entry entry = (ConfigurableCacheMap.Entry) iter.next(); StringBuffer buffer = new StringBuffer(); // If the contents of the entry (for example the key/value) need // to be examined, invoke convertEntry(entry) in case // the entry must be deserialized Map.Entry convertedEntry = convertEntry(entry); buffer.append("Entry: ").append(convertedEntry); // Here's how to get metadata about creation/last touched // timestamps for entries. This information might be used // in determining what gets evicted. if (entry instanceof LocalCache.Entry) { buffer.append(", create millis="); buffer.append(((LocalCache.Entry) entry).getCreatedMillis()); } buffer.append(", last touch millis="); buffer.append(entry.getLastTouchMillis()); // This output is for illustrative purposes; this may generate // excessive output in a production system System.out.println(buffer); // iterate and remove items // from the cache until below the maximum. Note that // the non converted entry key is passed to the evict method cache.evict(entry.getKey()); } } /** * If a {@link BackingMapManagerContext} is configured, wrap the * Entry with {@link ConverterCollections.ConverterEntry} in order * to deserialize the entry. * * @see ConverterCollections.ConverterEntry * @see BackingMapManagerContext * * @param entry entry to convert if necessary * * @return an entry that deserializes its key and value if necessary */ protected Map.Entry convertEntry(Map.Entry entry) { BackingMapManagerContext ctx = m_ctx; return ctx == null ? entry : new ConverterCollections.ConverterEntry(entry, ctx.getKeyFromInternalConverter(), ctx.getValueFromInternalConverter(), ctx.getValueToInternalConverter()); } private BackingMapManagerContext m_ctx; }
例13-8は、エビクション・ポリシーが指定されているCoherenceキャッシュ構成ファイルを示しています。
例13-8 coherence-cache-config.xmlファイル内のカスタム・エビクション・ポリシー
<?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>*</cache-name> <scheme-name>example-near</scheme-name> </cache-mapping> </caching-scheme-mapping> <caching-schemes> <near-scheme> <scheme-name>example-near</scheme-name> <front-scheme> <local-scheme> <eviction-policy> <class-scheme> <class-name> com.tangosol.examples.eviction.SimpleEvictionPolicy </class-name> </class-scheme> </eviction-policy> <high-units>1000</high-units> </local-scheme> </front-scheme> <back-scheme> <distributed-scheme> <scheme-ref>example-distributed</scheme-ref> </distributed-scheme> </back-scheme> <invalidation-strategy>all</invalidation-strategy> <autostart>true</autostart> </near-scheme> <distributed-scheme> <scheme-name>example-distributed</scheme-name> <service-name>DistributedCache</service-name> <backing-map-scheme> <local-scheme> <eviction-policy> <class-scheme> <class-name> com.tangosol.examples.eviction.SimpleEvictionPolicy </class-name> <init-params> <!-- Passing the BackingMapManagerContext to the eviction policy; this is required for deserializing entries --> <init-param> <param-type> com.tangosol.net.BackingMapManagerContext</param-type> <param-value>{manager-context}</param-value> </init-param> </init-params> </class-scheme> </eviction-policy> <high-units>20</high-units> <unit-calculator>binary</unit-calculator> </local-scheme> </backing-map-scheme> <autostart>true</autostart> </distributed-scheme> </caching-schemes> </cache-config>
<near-scheme>
要素は、ニア・キャッシュの定義に使用されます。ニア・キャッシュは、2つのキャッシュを含む複合キャッシュです。<front-scheme>
要素は、ローカル(フロント層)キャッシュの定義に使用され、<back-scheme>
要素は(バック層)キャッシュの定義に使用されます。一般に、ローカル・キャッシュはフロント層に使用されますが、フロント層は、Javaオブジェクトをベースとするスキーム(<class-scheme>
を使用)およびJVMヒープ以外をベースとするキャッシュ(<external-scheme>
または <paged-external-scheme>
を使用)も使用できます。バック層のキャッシュは、<back-scheme>
要素によって記述されます。バック層キャッシュには、任意のクラスタ化キャッシュ・タイプおよび任意のスタンドアロンのキャッシュ・タイプを使用できます。<near-scheme>要素の詳細なリファレンスについては、「near-scheme」
を参照してください。
例13-9では、スキーム名としてnear
を使用し、キャッシュ名example
にマップされるニア・キャッシュを定義します。フロント層はローカル・キャッシュでバック層は分散キャッシュです。
注意: ニア・キャッシュはキャッシュ・クライアントに使用され、一般にキャッシュ・サーバーでは使用されません。また、キャッシュ構成ファイル内のキャッシュ定義がニア・キャッシュのみの場合、キャッシュ・サーバーは起動しません。 |
例13-9 ニア・キャッシュ定義のサンプル
<?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>example</cache-name> <scheme-name>near</scheme-name> </cache-mapping> </caching-scheme-mapping> <caching-schemes> <near-scheme> <scheme-name>near</scheme-name> <front-scheme> <local-scheme/> </front-scheme> <back-scheme> <distributed-scheme> <scheme-name>near-distributed</scheme-name> <backing-map-scheme> <local-scheme/> </backing-map-scheme> <autostart>true</autostart> </distributed-scheme> </back-scheme> </near-scheme> </caching-schemes> </cache-config>
Coherence*Extendを使用する場合は、『Oracle Coherenceリモート・クライアントの開発』のC++クライアント用ニア・キャッシュの定義に関する項と.NETクライアント用ニア・キャッシュの定義に関する項を参照してください。
<invalidation-strategy>
は、ニア・キャッシュのオプションのサブ要素です。フロント層およびバック層のオブジェクトの同期を保つ戦略を指定するには、無効化戦略が使用されます。ニア・キャッシュでは、バック・キャッシュの特定のイベントをリスニングして、フロント・キャッシュ内のエントリを自動的に更新または無効化するように構成できます。ニア・キャッシュでは、バック・キャッシュの他のプロセスによって変更されたフロント・キャッシュのエントリの無効化戦略が5通りあり、バック・キャッシュで実装されるインタフェースに応じた戦略を選択できます。
注意: all の無効化戦略を使用する際に多数のエントリを変更するキャッシュ操作(クリア操作など)が存在する場合、イベントが大量に発生してネットワークが飽和状態になるおそれがあります。 |
表13-1は、これらの無効化戦略についてまとめたものです。無効化戦略、およびリードスルー/ライトスルー戦略の詳細は、第15章「データ・ソースのキャッシュ」を参照してください。
表13-1 ニア・キャッシュの無効化戦略
戦略名 | 説明 |
---|---|
|
戦略が指定されていない場合のデフォルトの戦略。この戦略は、 |
|
この戦略は、現在フロント・キャッシュに存在しているアイテムのみに関連するバック・キャッシュのイベントがニア・キャッシュでリスニングされるように指定します。この戦略は、フロント・キャッシュの各インスタンスに、フロント・キャッシュの他のインスタンス(スティッキーなデータ・アクセス・パターンなど)に関連するデータの個別のサブセットが含まれている場合に最適です。 |
|
この戦略は、バック・キャッシュのすべてのイベントがニア・キャッシュでリスニングされるように指定します。この戦略は、フロント・キャッシュの様々なインスタンス間に著しい重複が存在する、読取り頻度の高い段階的なアクセス・パターンに最適です。 |
|
この戦略は、統合削除でないすべてのバッキング・マップ・イベントがニア・キャッシュでリスニングされるように指示します。統合削除イベントは、エビクションまたは期限切れの結果として出力されることがあります。この無効化戦略では、バッキング・マップから統合的に削除されたキャッシュ・エントリをフロント・マップに含めることができます。その後にバッキング・マップにこれらのエントリを再挿入すると、フロント・マップの対応するエントリは無効化されます。 |
|
この戦略は、無効化イベントを一切リスニングしないようにキャッシュに指示します。これは、パフォーマンスとスケーラビリティが低く、現在値ではない可能性があるデータの使用がビジネス要件で許可されている場合に最適です。データの鮮度は、フロント・キャッシュに対する十分に簡潔なエビクション・ポリシーを使用することで保証できます。 |
スキームの継承を使用すると、別のスキームを継承し、継承したスキームのプロパティを必要に応じて選択的にオーバーライドすることにより、キャッシュ・スキームを作成できます。こうした柔軟性によって、キャッシュ・スキームの管理が容易になり、キャッシュ・スキームの再利用が促進されます。キャッシュ・スキーム定義で<scheme-ref>
要素を使用して、継承元のキャッシュ・スキームの名前を指定します。
例13-10では、同等の分散キャッシュ・スキームを2つ作成します。最初の定義では、バッキング・マップに使用されるローカル・スキームを明示的に構成します。2番目の定義では、<scheme-ref>
要素を使用して、LocalSizeLimited
という名前のローカル・スキームを継承します。
例13-10 キャッシュ・スキーム参照の使用
<distributed-scheme> <scheme-name>DistributedInMemoryCache</scheme-name> <service-name>DistributedCache</service-name> <backing-map-scheme> <local-scheme> <eviction-policy>LRU</eviction-policy> <high-units>1000</high-units> <expiry-delay>1h</expiry-delay> </local-scheme> </backing-map-scheme> </distributed-scheme>
<distributed-scheme> <scheme-name>DistributedInMemoryCache</scheme-name> <service-name>DistributedCache</service-name> <backing-map-scheme> <local-scheme> <scheme-ref>LocalSizeLimited</scheme-ref> </local-scheme> </backing-map-scheme> </distributed-scheme> <local-scheme> <scheme-name>LocalSizeLimited</scheme-name> <eviction-policy>LRU</eviction-policy> <high-units>1000</high-units> <expiry-delay>1h</expiry-delay> </local-scheme>
例13-10では、最初の分散スキーム定義の方が簡潔ですが、2番目の定義ではLocalSizeLimited
スキームを複数のスキームで容易に再利用できます。例13-11では、複数のスキームで同じLocalSizeLimited
ベース定義が再利用され、expiry-delay
プロパティがオーバーライドされます。
例13-11 複数のキャッシュ・スキームでのスキーム継承の使用
<distributed-scheme> <scheme-name>DistributedInMemoryCache</scheme-name> <service-name>DistributedCache</service-name> <backing-map-scheme> <local-scheme> <scheme-ref>LocalSizeLimited</scheme-ref> </local-scheme> </backing-map-scheme> </distributed-scheme> <replicated-scheme> <scheme-name>ReplicatedInMemoryCache</scheme-name> <service-name>ReplicatedCache</service-name> <backing-map-scheme> <local-scheme> <scheme-ref>LocalSizeLimited</scheme-ref> <expiry-delay>10m</expiry-delay> </local-scheme> </backing-map-scheme> </replicated-scheme> <local-scheme> <scheme-name>LocalSizeLimited</scheme-name> <eviction-policy>LRU</eviction-policy> <high-units>1000</high-units> <expiry-delay>1h</expiry-delay> </local-scheme>
キャッシュ・スキーム・プロパティは、必要に応じて特定のアプリケーションにおけるキャッシュの動作を変更します。それぞれのキャッシュ・スキーム・タイプには、そのキャッシュで有効な独自のプロパティ・セットがあります。キャッシュのプロパティは、キャッシュ・スキーム定義内で、それぞれのプロパティの要素を使用して設定されます。各キャッシュ・スキーム・タイプでサポートされるすべてのプロパティのリファレンスについては、付録B「キャッシュ構成の要素」を参照してください。
キャッシュ・スキーム定義で別の値が明示的に指定されている場合を除き、キャッシュ・プロパティでは多くの場合にデフォルト値が使用されます。クラスタ化キャッシュ(分散、レプリケートおよびオプティミスティック)では、それぞれのキャッシュ・サービス定義の指定に従ってデフォルト値が使用されます。キャッシュ・サービスは、オペレーション・デプロイメント・ディスクリプタで定義されます。オペレーション・オーバーライド・ファイルを使用してプロパティ値を変更することはできますが、一般にキャッシュのプロパティはキャッシュ・スキーム定義で設定されます。
例13-12では、サービス・スレッド・カウント・プロパティとリクエスト・タイムアウト・プロパティを設定する基本的な分散キャッシュ・スキームを作成します。さらに、バッキング・マップに使用されるローカル・スキームによって、ローカル・キャッシュのサイズを制限するプロパティが設定されます。キャッシュ・スキーム・プロパティを使用する手順については、このガイド全体を通して、そのスキームがサポートする機能の説明の一部として記載されています。
例13-12 キャッシュ・プロパティの設定
<?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>example</cache-name> <scheme-name>DistributedInMemoryCache</scheme-name> </cache-mapping> </caching-scheme-mapping> <caching-schemes> <distributed-scheme> <scheme-name>DistributedInMemoryCache</scheme-name> <service-name>DistributedCache</service-name> <thread-count>4</thread-count> <request-timeout>60s</request-timeout> <backing-map-scheme> <local-scheme> <scheme-ref>LocalSizeLimited</scheme-ref> </local-scheme> </backing-map-scheme> </distributed-scheme> <local-scheme> <scheme-name>LocalSizeLimited</scheme-name> <eviction-policy>LRU</eviction-policy> <high-units>1000</high-units> <expiry-delay>1h</expiry-delay> </local-scheme> </caching-schemes> </cache-config>
キャッシュ構成デプロイメント・ディスクリプタは、パラメータ・マクロの使用をサポートしています。パラメータ・マクロは、実行時に実際の値で置換されるリテラル文字列です。Coherenceには事前定義済のマクロが含まれ、ユーザー定義のマクロも許可されています。この項には次のトピックが含まれます:
ユーザー定義パラメータ・マクロによって、スキーム内のプロパティ値は、実行時にキャッシュ・マッピング初期化パラメータ内で構成された値で置換されます。ユーザー定義パラメータ・マクロによってキャッシュ・スキーム定義は最大限再利用され、キャッシュ構成ファイルのサイズは大幅に削減できます。
注意: パラメータ・マクロは、スレッド・カウント、パーティション・カウント、サービス名など、サービスにスコープが設定された(同じサービスのすべてのキャッシュで共有する)アイテムでは使用しないでください。パラメータ・マクロは、有効期限、high units、キャッシュ・ストアなど、キャッシュにスコープが設定されたアイテムで使用する必要があります。 |
ユーザー定義パラメータ・マクロを定義するには、リテラル文字列をプロパティ値として中カッコの中に入れます。文字列の最後に前にスペースを付けた値を置くことによって、パラメータ・マクロにオプションのデフォルト値も含めることもできます。ユーザー定義パラメータ・マクロの形式は、次のとおりです:
{user-defined-name default_value}
次の例は、back-size-limit
というユーザー定義マクロを作成します。マクロはバッキング・マップの<high-units>
プロパティとして使用され、プロパティ値は実行時に置換されます。マクロは、<high-units>
プロパティのデフォルト値として500
を指定しています。
<caching-schemes> <distributed-scheme> <scheme-name>distributed</scheme-name> <backing-map-scheme> <local-scheme> <high-units>{back-size-limit 500}</high-units> </local-scheme> </backing-map-scheme> <autostart>true</autostart> </distributed-scheme> </caching-schemes>
実行時に、<high-units>
の値はキャッシュ・マッピング定義で定義される初期化パラメータを使用して置換されます。次の例では、<init-param>
要素を使用し、<param-name>
要素をback-size-limit
に、<param-value>
要素を1000
に設定することによって、デフォルト値の500を1000でオーバーライドしています。<init-param>要素の詳細なリファレンスについては、「init-param」
を参照してください。
<caching-scheme-mapping> <cache-mapping> <cache-name>example</cache-name> <scheme-name>distributed</scheme-name> <init-params> <init-param> <param-name>back-size-limit</param-name> <param-value>1000</param-value> </init-param> </init-params> </cache-mapping> <caching-scheme-mapping> <caching-schemes> <distributed-scheme> <scheme-name>distributed</scheme-name> <backing-map-scheme> <local-scheme> <high-units>{back-size-limit 500}</high-units> </local-scheme> </backing-map-scheme> <autostart>true</autostart> </distributed-scheme> </caching-schemes>
ユーザー定義パラメータ・マクロの使用の利点は、複数のキャッシュ・マッピングで同じキャッシュ・スキームを使用でき、必要に応じて異なるプロパティ値を設定できることです。例13-13は、同じキャッシュ・スキームを再利用する2つのキャッシュ・マッピングを示しています。ただし、マッピングは<high-units>
要素に異なる値を持つキャッシュとなります。
例13-13 キャッシュ・マッピングからのユーザー定義マクロのオーバーライド
... <caching-scheme-mapping> <cache-mapping> <cache-name>*</cache-name> <scheme-name>distributed</scheme-name> </cache-mapping> <cache-mapping> <cache-name>example</cache-name> <scheme-name>distributed</scheme-name> <init-params> <init-param> <param-name>back-size-limit</param-name> <param-value>1000</param-value> </init-param> </init-params> </cache-mapping> <caching-scheme-mapping> <caching-schemes> <distributed-scheme> <scheme-name>distributed</scheme-name> <backing-map-scheme> <local-scheme> <high-units>{back-size-limit 500}</high-units> </local-scheme> </backing-map-scheme> <autostart>true</autostart> </distributed-scheme> </caching-schemes>
Coherenceには事前定義済のパラメータ・マクロが含まれているため、カスタム・コーディングを最小限に抑えて、一般的に使用される属性をクラス・コンストラクタ・パラメータの構成時に指定することができます。マクロは中カッコに入れる必要があり、param-type
またはparam-value
のどちらか要素に固有です。
表13-2では、指定可能な事前定義済パラメータ・マクロについて説明しています。
表13-2 キャッシュ構成の事前定義済パラメータ・マクロ
<param-type> | <param-value> | 説明 |
---|---|---|
|
|
現在のキャッシュ名をコンストラクタ・パラメータとして渡すために使用します。例: <class-name>com.mycompany.cache.CustomCacheLoader </class-name> <init-params> <init-param> <param-type>java.lang.String</param-type> <param-value>{cache-name}</param-value> </init-param> </init-params> |
|
|
現在のクラスローダーをコンストラクタ・パラメータとして渡すために使用します。例: <class-name>com.mycompany.cache.CustomCacheLoader </class-name> <init-params> <init-param> <param-type>java.lang.ClassLoader</param-type> <param-value>{class-loader}</param-value> </init-param> </init-params> |
|
|
現在の <class-name>com.mycompany.cache.CustomCacheLoader </class-name> <init-params> <init-param> <param-type> com.tangosol.net.BackingMapManagerContext </param-type> <param-value>{manager-context}</param-value> </init-param> </init-params> |
|
|
<class-scheme> <scheme-name>dbconnection</scheme-name> <class-name>com.mycompany.dbConnection</class-name> <init-params> <init-param> <param-name>driver</param-name> <param-type>String</param-type> <param-value>org.gjt.mm.mysql.Driver </param-value> </init-param> <init-param> <param-name>url</param-name> <param-type>String</param-type> <param-value> jdbc:mysql://dbserver:3306/companydb </param-value> </init-param> <init-param> <param-name>user</param-name> <param-type>String</param-type> <param-value>default</param-value> </init-param> <init-param> <param-name>password</param-name> <param-type>String</param-type> <param-value>default</param-value> </init-param> </init-params> </class-scheme> ... <class-name>com.mycompany.cache.CustomCacheLoader </class-name> <init-params> <init-param> <param-type>{scheme-ref}</param-type> <param-value>dbconnection</param-value> </init-param> </init-params> |
|
キャッシュ名 |
指定したキャッシュ名に対する <cache-config> <caching-scheme-mapping> <cache-mapping> <cache-name>boston-*</cache-name> <scheme-name>wrapper</scheme-name> <init-params> <init-param> <param-name>delegate-cache-name</param-name> <param-value>london-*</param-value> </init-param> </init-params> </cache-mapping> <cache-mapping> <cache-name>london-*</cache-name> <scheme-name>partitioned</scheme-name> </cache-mapping> </caching-scheme-mapping> <caching-schemes> <class-scheme> <scheme-name>wrapper</scheme-name> <class-name> com.tangosol.net.cache.WrapperNamedCache </class-name> <init-params> <init-param> <param-type>{cache-ref}</param-type> <param-value>{delegate-cache-name} </param-value> </init-param> <init-param> <param-type>string</param-type> <param-value>{cache-name}</param-value> </init-param> </init-params> </class-scheme> <distributed-scheme> <scheme-name>partitioned</scheme-name> <service-name>partitioned</service-name> <backing-map-scheme> <local-scheme> <unit-calculator>BINARY</unit-calculator> </local-scheme> </backing-map-scheme> <autostart>true</autostart> </distributed-scheme> </caching-schemes> </cache-config>
|