この章の内容は次のとおりです。
キャッシュは、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を参照してください。
正確なキャッシュ・マッピングでは、個別のキャッシュ名がキャッシュ・スキーム定義にマップされます。アプリケーションでキャッシュを使用するには、マッピングで指定されたとおりの名前で指定する必要があります。例12-1では、キャッシュ名exampleをdistributedというスキーム名の分散キャッシュ・スキーム定義にマップする、単一キャッシュのマッピングを作成します。
例12-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>
名前パターン・キャッシュ・マッピングを使用すると、アプリケーションでキャッシュ名を指定する際にパターンを使用できます。パターンではアスタリスク(*)ワイルドカードを使用できます。名前パターンを使用することで、アプリケーションでキャッシュの正確な名前を認識する必要がなくなります。例12-2では、キャッシュ・マッピングを2つ作成します。最初のマッピングでは、ワイルドカード(*)を使用して、任意のキャッシュ名をdistributedというスキーム名の分散キャッシュ・スキーム定義にマップします。2番目のマッピングでは、名前パターンaccount-*をaccount-distributedというスキーム名のキャッシュ・スキーム定義にマップします。
例12-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というスキーム名のキャッシュ・スキーム定義を使用します。
例12-2に示されているように、複数のキャッシュ・マッピングに一致するキャッシュ名(たとえば、account-overdue)を持つことが可能です。このような場合、正確なキャッシュ・マッピングで定義されているものがあると、それがワイルドカードの一致よりも優先されて常に選択されます。複数のワイルドカードの一致の中で、最後に一致したワイルドカード・マッピング(ファイルで定義された順番に基づく)が選択されます。そのため、あまり限定的でないワイルドカード・パターンをファイルの先に定義し、ファイル後方のより限定的なワイルドカード・パターンでオーバーライドされるようにするのが一般的です。
キャッシュ・スキームは、アプリケーションで使用可能なキャッシュの定義に使用されます。キャッシュ・スキームによって宣言メカニズムが指定されます。これにより、キャッシュを使用するアプリケーションに依存せずにキャッシュを定義できるようになります。そのため、アプリケーションでキャッシュを定義する必要がなくなり、アプリケーションのコードを変更せずにキャッシュを変更できるようになります。キャッシュ・スキームにより、多数のアプリケーションで同一のキャッシュ定義が使用可能となり、キャッシュ定義の再利用も促進されます。
キャッシュ・スキームは<caching-schemes>要素で定義されます。キャッシュ・タイプ(分散、レプリケートなど)ごとに、対応するスキーム要素と、そのタイプのキャッシュ定義に使用されるプロパティがあります。キャッシュ・スキームはネストも可能であり、ニア・キャッシュのように高度にカスタマイズされた複合キャッシュも使用できます。<caching-schemes>要素の詳細なリファレンスについては、caching-schemesを参照してください。
この項では、最も使用頻度の高いキャッシュ・タイプのキャッシュ・スキームの定義方法を説明しますが、Coherenceで用意されているすべてのキャッシュ・タイプを網羅しているわけではありません。その他のキャッシュ・タイプのキャッシュ・スキームを定義する手順については、このガイド全体を通して、そのスキームがサポートする機能の説明の一部として記載されています。この項には次のトピックが含まれます:
<distributed-scheme>要素は、分散キャッシュの定義に使用されます。分散キャッシュでは、分散(パーティション)キャッシュ・サービス・インスタンスを使用します。キャッシュ構成ファイルで、分散キャッシュを必要な数だけ定義できます。<distributed-scheme>要素の詳細なリファレンスについては、distributed-schemeを参照してください。
例12-3では、スキーム名としてdistributedを使用し、キャッシュ名exampleにマップされる、基本的な分散キャッシュを定義します。<autostart>要素をtrueに設定すると、キャッシュ・サーバー・ノード上でサービスを開始します。
例12-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>
この例では、分散キャッシュによって、バッキング・マップとして使用されるローカル・キャッシュが定義されます。バッキング・マップの構成の詳細は、記憶域およびバッキング・マップの実装を参照してください。
<replicated-scheme>要素は、レプリケート・キャッシュの定義に使用されます。レプリケート・キャッシュでは、レプリケート・キャッシュ・サービス・インスタンスを使用します。キャッシュ構成ファイルで、レプリケート・キャッシュを必要な数だけ定義できます。<replicated-scheme>要素の詳細なリファレンスについては、replicated-schemeを参照してください。
例12-4では、スキーム名としてreplicatedを使用し、キャッシュ名exampleにマップされる、基本的なレプリケート・キャッシュを定義します。<autostart>要素をtrueに設定すると、キャッシュ・サーバー・ノード上でサービスを開始します。
例12-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>
この例では、レプリケート・キャッシュによって、バッキング・マップとして使用されるローカル・キャッシュが定義されます。バッキング・マップの構成の詳細は、記憶域およびバッキング・マップの実装を参照してください。
<optimistic-scheme>要素は、オプティミスティック・キャッシュの定義に使用されます。オプティミスティック・キャッシュでは、オプティミスティック・キャッシュ・サービス・インスタンスを使用します。キャッシュ構成ファイルで、オプティミスティック・キャッシュを必要な数だけ定義できます。<optimistic-scheme>要素の詳細なリファレンスについては、optimistic-schemeを参照してください。
例12-5では、スキーム名としてoptimisticを使用し、キャッシュ名exampleにマップされる、基本的なオプティミスティック・キャッシュを定義します。<autostart>要素をtrueに設定すると、キャッシュ・サーバー・ノード上でサービスを開始します。
例12-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>
この例では、オプティミスティック・キャッシュによって、バッキング・マップとして使用されるローカル・キャッシュが定義されます。バッキング・マップの構成の詳細は、記憶域およびバッキング・マップの実装を参照してください。
<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を参照してください。
例12-6では、スキーム名としてlocalを使用しキャッシュ名exampleにマップされる、ローカル・キャッシュを定義します。
注意:
一般にローカル・キャッシュは、キャッシュ・サーバー上のスタンドアロン・キャッシュとしては使用されません、また、キャッシュ構成ファイル内のキャッシュ定義がローカル・キャッシュのみの場合、クラスタリング・キャッシュ・サーバー分散は起動しません。
例12-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クライアント用ローカル・キャッシュの構成に関する項を参照してください。
例12-6に示すように、<local-scheme>には、キャッシュの拡大を制御するためのオプションのサブ要素がいくつか用意されています。たとえば、サブ要素<low-units>および<high-units>は、キャッシュのサイズを制限します。キャッシュが最大許容サイズに達すると、指定されたエビクション・ポリシー(<eviction-policy>)に従って削除対象エントリが決定され、指定されたより小さなサイズに戻ります。エントリおよびサイズの制限は、該当するスキームの単位換算カリキュレータ(<unit-calculator>)で計算される単位で測定されます。
ローカル・キャッシュに関しては、キャッシュ構成要素<expiry-delay>を使用して、キャッシュに保持されていたアイテムが期限切れになるまでの時間長を構成します。expiry-delay値に到達したエントリは事前に削除されるため、アクセスできなくなります。
注意:
expiry-delayのパラメータ(cExpiryMillis)は整数として定義し、ミリ秒単位で表します。そのため、最大期間はInteger.MAX_VALUE (2147483647)ミリ秒数を超えることはできず、おおよそ24日間になります。
LocalCacheクラスは、サイズの制限されたキャッシュに使用されます。これは、ヒープ上のオブジェクトのキャッシュ(ローカル・キャッシュやニア・キャッシュのフロント部分など)、およびパーティション・キャッシュのバッキング・マップの両方に使用されます。アプリケーションでは、LocalCacheで使用するカスタム・エビクション・ポリシーを指定できます。
Coherenceのデフォルトのエビクション・ポリシーは大半のワークロードに対して非常に効率的であり、ほとんどのアプリケーションでカスタム・ポリシーを提供する必要がなくなります。一般的に、エビクション・ポリシーを使用するのは、削除されたデータがバッキング・システム(ニア・キャッシュのバック部分またはデータベース)に存在する場合に限定することをお薦めします。エビクションは、論理操作(エンティティの削除)ではなく、物理操作(メモリーの解放)として扱ってください。
例12-7は、単純なカスタム・エビクション・ポリシーの実装を示しています。
例12-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;
}
例12-8は、エビクション・ポリシーが指定されているCoherenceキャッシュ構成ファイルを示しています。
例12-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を参照してください。
例12-9では、スキーム名としてnearを使用し、キャッシュ名exampleにマップされるニア・キャッシュを定義します。フロント層はローカル・キャッシュでバック層は分散キャッシュです。
注意:
ニア・キャッシュはキャッシュ・クライアントに使用され、一般にキャッシュ・サーバーでは使用されません。また、キャッシュ構成ファイル内のキャッシュ定義がニア・キャッシュのみの場合、キャッシュ・サーバーは起動しません。
例12-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>
<invalidation-strategy>は、ニア・キャッシュのオプションのサブ要素です。フロント層およびバック層のオブジェクトの同期を保つ戦略を指定するには、無効化戦略が使用されます。ニア・キャッシュでは、バック・キャッシュの特定のイベントをリスニングして、フロント・キャッシュ内のエントリを自動的に更新または無効化するように構成できます。ニア・キャッシュでは、バック・キャッシュの他のプロセスによって変更されたフロント・キャッシュのエントリの無効化戦略が5通りあり、バック・キャッシュで実装されるインタフェースに応じた戦略を選択できます。
注意:
allの無効化戦略を使用する際に多数のエントリを変更するキャッシュ操作(クリア操作など)が存在する場合、イベントが大量に発生してネットワークが飽和状態になるおそれがあります。
表12-1は、これらの無効化方針についてまとめたものです。無効化戦略、およびリードスルー/ライトスルー戦略の詳細は、データ・ソースのキャッシュを参照してください。
表12-1 ニア・キャッシュの無効化方針
| 戦略名 | 説明 |
|---|---|
|
戦略が指定されていない場合のデフォルトの戦略。この戦略は、 |
|
この戦略は、現在フロント・キャッシュに存在しているアイテムのみに関連するバック・キャッシュのイベントがニア・キャッシュでリスニングされるように指定します。この戦略は、フロント・キャッシュの各インスタンスに、フロント・キャッシュの他のインスタンス(スティッキーなデータ・アクセス・パターンなど)に関連するデータの個別のサブセットが含まれている場合に最適です。 |
|
この戦略は、バック・キャッシュのすべてのイベントがニア・キャッシュでリスニングされるように指定します。この戦略は、フロント・キャッシュの様々なインスタンス間に著しい重複が存在する、読取り頻度の高い段階的なアクセス・パターンに最適です。 |
|
この戦略は、統合削除でないすべてのバッキング・マップ・イベントがニア・キャッシュでリスニングされるように指示します。統合削除イベントは、エビクションまたは期限切れの結果として出力されることがあります。この無効化戦略では、バッキング・マップから統合的に削除されたキャッシュ・エントリをフロント・マップに含めることができます。その後にバッキング・マップにこれらのエントリを再挿入すると、フロント・マップの対応するエントリは無効化されます。 |
|
この戦略は、無効化イベントを一切リスニングしないようにキャッシュに指示します。これは、パフォーマンスとスケーラビリティが低く、現在値ではない可能性があるデータの使用がビジネス要件で許可されている場合に最適です。データの鮮度は、フロント・キャッシュに対する十分に簡潔なエビクション・ポリシーを使用することで保証できます。フロント・マップは、拡張クライアントがプロキシで切断されるとリセットされることに注意してください。 |
スキームの継承を使用すると、別のスキームを継承し、継承したスキームのプロパティを必要に応じて選択的にオーバーライドすることにより、キャッシュ・スキームを作成できます。こうした柔軟性によって、キャッシュ・スキームの管理が容易になり、キャッシュ・スキームの再利用が促進されます。キャッシュ・スキーム定義で<scheme-ref>要素を使用して、継承元のキャッシュ・スキームの名前を指定します。
例12-10では、同等の分散キャッシュ・スキームを2つ作成します。最初の定義では、バッキング・マップに使用されるローカル・スキームを明示的に構成します。2番目の定義では、<scheme-ref>要素を使用して、LocalSizeLimitedという名前のローカル・スキームを継承します。
例12-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>
例12-10では、最初の分散スキーム定義の方が簡潔ですが、2番目の定義ではLocalSizeLimitedスキームを複数のスキームで容易に再利用できます。例12-11では、複数のスキームで同じLocalSizeLimitedベース定義が再利用され、expiry-delayプロパティがオーバーライドされます。
例12-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>
キャッシュ・スキーム・プロパティは、必要に応じて特定のアプリケーションにおけるキャッシュの動作を変更します。それぞれのキャッシュ・スキーム・タイプには、そのキャッシュで有効な独自のプロパティ・セットがあります。キャッシュのプロパティは、キャッシュ・スキーム定義内で、それぞれのプロパティの要素を使用して設定されます。各キャッシュ・スキーム・タイプでサポートされるすべてのプロパティのリファレンスについては、キャッシュ構成の要素を参照してください。
キャッシュ・スキーム定義で別の値が明示的に指定されている場合を除き、キャッシュ・プロパティでは多くの場合にデフォルト値が使用されます。クラスタ化キャッシュ(分散、レプリケートおよびオプティミスティック)では、それぞれのキャッシュ・サービス定義の指定に従ってデフォルト値が使用されます。キャッシュ・サービスは、オペレーション・デプロイメント・ディスクリプタで定義されます。オペレーション・オーバーライド・ファイルを使用してプロパティ値を変更することはできますが、一般にキャッシュのプロパティはキャッシュ・スキーム定義で設定されます。
例12-12では、サービス・スレッド・カウント・プロパティとリクエスト・タイムアウト・プロパティを設定する基本的な分散キャッシュ・スキームを作成します。さらに、バッキング・マップに使用されるローカル・スキームによって、ローカル・キャッシュのサイズを制限するプロパティが設定されます。キャッシュ・スキーム・プロパティを使用する手順については、このガイド全体を通して、そのスキームがサポートする機能の説明の一部として記載されています。
例12-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-min>4</thread-count-min>
<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>
ユーザー定義パラメータ・マクロの使用の利点は、複数のキャッシュ・マッピングで同じキャッシュ・スキームを使用でき、必要に応じて異なるプロパティ値を設定できることです。次の例は、同じキャッシュ・スキームを再利用する2つのキャッシュ・マッピングを示しています。ただし、マッピングは<high-units>要素に異なる値を持つキャッシュとなります。
...
<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のどちらか要素に固有です。
表12-2では、指定可能な事前定義済パラメータ・マクロについて説明しています。
表12-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 name |
指定したキャッシュ名に対する <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>
|
キャッシュ構成デプロイメント・ディスクリプタは、システム・プロパティ・マクロの使用をサポートしています。システム・プロパティ・マクロは、値の一部をシステム・プロパティの値で置き換えることができるリテラル文字列です。システム・プロパティ・マクロにより、キャッシュ構成ファイルのサイズを減らすことができるため、ランタイム構成を簡素化できます。
システム・プロパティ・マクロを定義するには、システム・プロパティを表すリテラル文字列を中カッコの中に入れ、中カッコの前にドル記号($)を置きます。前にスペースを付けた値を文字列の最後に置くことによって、システム・プロパティ・マクロにオプションのデフォルト値も含めることもできます。システム・プロパティ・マクロの形式は、次のとおりです。
${system.property default_value}
次の例は、デフォルトのキャッシュ構成からの抜粋で、${coherence.profile near}および${coherence.client direct}の2つのシステム・プロパティ・マクロを使用します。マクロは、特定のキャッシュ・スキームを使用するために、それぞれのシステム・プロパティに設定されている値で実行時に置き換えられます。システム・プロパティ・キャッシュが設定されていない場合は、デフォルト値(near-direct)がスキーム名として使用されます。
<caching-scheme-mapping>
<cache-mapping>
<cache-name>*</cache-name>
<scheme-name>${coherence.profile near}-${coherence.client direct}
</scheme-name>
</cache-mapping>
</caching-scheme-mapping>
実行時にシステム・プロパティを設定すると、デフォルトのキャッシュに使用されるキャッシュ・スキームが変更されます。次に例を示します。
-Dcoherence.profile=thin -Dcoherence.client=remote