内の個々のエントリのTTLを変更し、例えば、キャッシュ内の個々のエントリで生活する時間を設定することが可能であった:EHCacheなど2.xでEHCacheなど3
Element dependentElement = cache.get(key);
long lastAccessTime = dependentElement.getLastAccessTime();
long creationTime = dependentElement.getCreationTime();
int timeToLive = lastAccessTime == 0 ? 300 : (int)
(lastAccessTime - creationTime)/1000 + 300;
timeToLive += 2;
dependentElement.setTimeToLive(timeToLive);
これはTTLを更新してしまいますそのため、キャッシュに長く保持されます。
EHCache 3.xでは、これは個々のキャッシュエントリ単位で行うことはもはやできないようです。 Migration Guideとthis questionを読んだ後、この機能は直接移行可能ではないようです。
ガイドはTTLを変更するために、インタフェースを実装しなければならないことを教えてくれる:
CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class,
String.class, ResourcePoolsBuilder
.withExpiry(new Expiry<Long, String>() {
@Override
public Duration getExpiryForCreation(Long key, String value) {
return getTimeToLiveDuration(key, value);
}
@Override
public Duration getExpiryForAccess(Long key, ValueSupplier<? extends String> value) {
return null; // Keeping the existing expiry
}
@Override
public Duration getExpiryForUpdate(Long key, ValueSupplier<? extends String> oldValue, String newValue) {
return null; // Keeping the existing expiry
}
});
この構成は、次に初期化するキャッシュに追加されます。ただし、キャッシュレベルの拡張ポイントであるため、変更する実際のエントリに対してメソッドがトリガーされることを保証することはできません。
EHCacheなど3の内部を見ると、古き良きnet.sf.ehcache.Elementを抽象化し、のValueHolderに<V>を変更し、これをアクセスすることはできなくなりましたことをされているようです。
したがって、問題は次のようなものです。EHCache 3.xで同じ動作をどのように実装できますか?エントリががが又は更新にアクセスし、を作成するとき
ありがとう、それは私が考えたものです。我々は再実施する。 – Raimond