2

アプリケーション コンポーネントで SelfPopulatingCache を使用することを計画しています。これは、リードスルーと更新用のバッキング キャッシュのように見えるものをサポートするためです。

ただし、timeToLiveSecondsの構成には少し困惑しています。これは私のテスト構成です:

<ehcache>
    <diskStore path="java.io.tmpdir"/>

    <cache name="myCache" maxElementsInMemory="50000" overflowToDisk="false"
    eternal="false" timeToIdleSeconds="0" timeToLiveSeconds="2"/>

</ehcache>

単体テストでは、次のことを行います。

  • キャッシュに 2 つのエントリがあることを確認します
  • 3秒間眠る
  • ただし、スリープ後、キャッシュにはまだ 2 つのエントリがあります。

オンラインの他の投稿 (ドキュメントではありません) によると、次に読み取りを実行すると、エントリが削除されます。

ただし、代わりに CacheEntryFactory が呼び出され、有効期限が切れた要素のキャッシュに null 要素が追加されます。

timeToLiveSeconds の有効期限が切れたときに代わりに完全なエビクションを実行するようにこれを構成する方法はありますか?

4

1 に答える 1

3

「完全な立ち退き」は、別の有効期限スレッドがあった場合にのみ発生すると思います。残念ながら、メモリ内エントリにはそのようなものはありません。Ehcache FAQ の引用:

MemoryStore には要素の最大数が固定されているため、最大メモリ使用量は、要素数に平均サイズを掛けた値に等しくなります。最大サイズを超えて要素が追加されると、LRU 要素が DiskStore にプッシュされます。要素を定期的に期限切れにする有効期限スレッドを使用することもできますが、必要な場合にのみチェックする方がはるかに効率的です。トレードオフは、より高い平均メモリ使用量です。有効期限スレッドは、DiskStore をクリーンに保ちます。一般的に使用される値は MemoryStore にあるため、DiskStore のロックの競合が少なくなることが期待されます。RAMFS を使用して Linux に DiskStore をマウントするので、OS メモリを使用します。これは 2GB の 32 ビット プロセス サイズの制限を超えていますが、依然として高価なリソースです。DiskStore スレッドはそれを制御下に置きます。CPU 使用率と DiskStore でのロックが気になる場合は、diskExpiryThreadIntervalSeconds を 1 日などの高い数値に設定できます。または、diskExpiryThreadIntervalSeconds を非常に大きな値に設定することで、効果的に無効にすることができます。

于 2012-12-18T22:00:04.337 に答える