LocalCacheクラスは、サイズ制限のあるキャッシュに使用します。ヒープ上のオブジェクトのキャッシュ(ローカル・キャッシュやニア・キャッシュのフロント部分など)や、パーティション・キャッシュのバッキング・マップとして使用されます。アプリケーションでは、LocalCacheで使用するカスタム・エビクション・ポリシーを指定できます。
Coherenceのデフォルト・エビクション・ポリシーは、ほとんどのワークロードで非常に効果的であるため、大半のアプリケーションでは、カスタム・ポリシーを指定する必要はありません。一般的に、エビクション・ポリシーを使用するのは、削除されたデータがバッキング・システム(ニア・キャッシュのバック部分またはデータベース)に存在する場合に限定することをお薦めします。エビクションは、論理操作(エンティティの削除)ではなく、物理操作(メモリーの解放)として扱ってください。
例10-1は、単純なカスタム・エビクション・ポリシーの実装を示しています。
例10-1 カスタム・エビクション・ポリシーの実装
import com.tangosol.net.cache.CacheEvent;
import com.tangosol.net.cache.ConfigurableCacheMap;
import com.tangosol.net.cache.LocalCache;
import com.tangosol.util.AbstractMapListener;
import com.tangosol.util.MapEvent;
import java.util.Iterator;
public class MyEvictionPolicy extends AbstractMapListener implements ConfigurableCacheMap.EvictionPolicy
{
LocalCache m_cache = null;
public void entryInserted(MapEvent evt)
{
System.out.println("entryInserted:" + isSynthetic(evt) + evt);
if (m_cache == null)
{
m_cache = (LocalCache) evt.getMap();
}
}
public void entryUpdated(MapEvent evt)
{
System.out.println("entryUpdated:" + isSynthetic(evt) + evt);
}
public void entryDeleted(MapEvent evt)
{
System.out.println("entryDeleted:" + isSynthetic(evt) + evt);
}
String isSynthetic(MapEvent evt)
{
// synthetic events are caused by internal processing - eviction or loading
return ((CacheEvent) evt).isSynthetic() ? " SYNTHETIC " : " ";
}
public void entryTouched(OldCache.Entry entry)
{
System.out.println("entryTouched:" + entry.getKey());
}
public void requestEviction(int cMaximum)
{
int cCurrent = m_cache.getUnits();
System.out.println("requestEviction: current:" + cCurrent + " to:" + cMaximum);
//
// ... eviction policy calculations ...
//
for (Iterator iter = m_cache.entrySet().iterator(); iter.hasNext();)
{
ConfigurableCacheMap.Entry entry = (ConfigurableCacheMap.Entry)
iter.next();
if (m_cache.getUnits() > cMaximum)
{
m_cache.evict(entry.getKey());
}
else
{
break;
}
}
}
public MyEvictionPolicy()
{
}
}
例10-2は、エビクション・ポリシーが指定されているCoherenceキャッシュ・コンフィギュレーション・ファイル(coherence-cache-config.xml)を示しています。
例10-2 coherence-cache-config.xmlファイル内のカスタム・エビクション・ポリシー
<?xml version="1.0"?>
<!DOCTYPE cache-config SYSTEM "cache-config.dtd">
<cache-config>
<caching-scheme-mapping>
<cache-mapping>
<cache-name>test</cache-name>
<scheme-name>example-near</scheme-name>
</cache-mapping>
</caching-scheme-mapping>
<caching-schemes>
<distributed-scheme>
<scheme-name>example-distributed</scheme-name>
<service-name>DistributedCache</service-name>
<backing-map-scheme>
<local-scheme>
<scheme-ref>example-backing-map</scheme-ref>
</local-scheme>
</backing-map-scheme>
<autostart>true</autostart>
</distributed-scheme>
<near-scheme>
<scheme-name>example-near</scheme-name>
<front-scheme>
<local-scheme>
<eviction-policy>
<class-scheme>
<class-name>MyEvictionPolicy</class-name>
</class-scheme>
</eviction-policy>
<high-units>10</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>
<local-scheme>
<scheme-name>example-backing-map</scheme-name>
<eviction-policy>HYBRID</eviction-policy>
<high-units>{back-size-limit 0}</high-units>
<expiry-delay>{back-expiry 1h}</expiry-delay>
<flush-delay>1m</flush-delay>
<cachestore-scheme></cachestore-scheme>
</local-scheme>
</caching-schemes>
</cache-config>