6

私のプロジェクトでは、ログに記録されたユーザーの詳細やその他の情報を保存するために ehcache を使用しています (db から取得する代わりに実行時にこれを使用するアプリ)。以下は、私の ehcache 構成です。

<cache 
    name="normalCache"
    maxElementsInMemory="50000" 
    eternal="false"
    timeToIdleSeconds="1800" 
    timeToLiveSeconds="0"
    overflowToDisk="false"
    memoryStoreEvictionPolicy="LRU"
/>

しかし、問題はほとんどの場合、セッション タイムアウトが発生することです (ユーザーが非アクティブでなくても 30 以上)。10分くらい続く時もあるけど…

すべてのアクションは、リクエストごとに ehcache からユーザー オブジェクトを取得しようとします。

ehcache が有効期限をどのように決定するかはわかりません。

4

3 に答える 3

1

ehcache は、すべての要素を 30 分間保持することを保証しません。

あなたの構成では、50000 の maxElementsInMemory があります。おそらく、ある時点で 50000 に達したため、overflowToDisk を false に設定したため、最も最近使用されていないエントリが削除されます。

于 2014-02-12T13:44:47.387 に答える
0

前文

セッション管理の実装として ehCache を使用する予定ですが、既に提供されている、おそらくより適切なセッションの実装を万が一使用できない場合は、まず確認してください。Web コンテナーまたは完全な jee サーバーを使用している場合は、最初にこれを試してください。


どうして

わかった。あなたはそれを正しい簡単な方法でやらないことは間違いありません。セッションに ehCache を使用する理由について、いくつかのヒントを示します。

  1. サービスは jee サーバー/Web コンテナーの一部ではありません。
  2. サービスはステートレスですが、状態 (フレームワーク コード) が必要になる場合があります。
  3. あなたと識別可能なクライアントの間のプロキシのために呼び出しを区別することはできません.
  4. あなたはRTFMをしなかっただけで、あなたのやり方でやりたいと思っています。

1 については、jetty のような Web コンテナーがオプションであるかどうかを確認してください。セッション全体の Web アクセスを使用しても、ポップアップは表示されません。

2 については、Apache Shiroが希望どおりに動作しないかどうかを確認してください。そうでない場合は、ehCache があなたの味方になる可能性があります。

クラブへようこそ。

4 については、まあ、マニュアルを読まないと、これも読まないでしょう。


方法

ehCache を使用してセッション管理を実装する場合は、データがシリアライズ可能であることを確認してください。これにより、問題が軽減され、ehCache の機密性の高い機能を使用できるようになります。つまり、ディスクへの永続性、ノードのキャッシュ、これからの回復などです。

すべてのセッションにキャッシュを使用するのではなく、すべてのセッションに1 つのキャッシュを使用してください。はsessionIdキャッシュのキーで、値はMap. 並行性を忘れないでください (ajax 呼び出しを考えてください)。ConcurrentHashMapfromを使用するのが最善かもしれませんjava.util.concurrent。しかし、あなたはハインツ M. カブツ博士であり、それを行うためのさらにクールな方法を見つけているかもしれません。

ストレージに保持する要素の量よりもサイズを使用する方が非常に役立つことがわかりました。後でどのデータ/オブジェクトが保存されるかはわからないかもしれません。永続化戦略を設定することを忘れないでください。ここで一時フォルダーに保存することを使用しました。

<?xml version="1.0" encoding="UTF-8"?>
<ehcache
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="ehcache.xsd"
    updateCheck="true"
    monitoring="autodetect"
    dynamicConfig="true">

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

    <cache name="vocCache"
        eternal="false"
        maxElementsInMemory="100MB"
        maxElementsOnDisk="1GB"
    timeToIdleSeconds="3600"
    timeToLiveSeconds="0"
    memoryStoreEvictionPolicy="LRU"
    diskExpiryThreadIntervalSeconds="60">
    <persistence strategy="localTempSwap" />
</cache>

セッションマネージャーを実装したいので、気にしませんtimeToLiveSeconds。セッションは、一定のアイドル時間が経過するとタイムアウトします。したがって、要素を最大の ttl に制限するのではなく、要素をtimeToIdleSecondsタイムアウトさせるために使用します。要素に特定の値を設定して後で追加できるため、 timeToIdleSecondsand を気にしないでください。timeToLiveSeconds

立ち退き

賞味期限について1点。構成された時間のために、メモリ内の要素が削除されることはありません。メモリは、定義されたメモリ制約に達するまで蓄積されます。したがって、100 要素を定義すると、101 要素が追加さmemoryStoreEvictionPolicyれると、ベットがトリガーされ、1 つの要素が (この構成では) ディスクにフラッシュされます (ehCache 2.2)。ディスク ストレージの場合、有効期限をチェックするスレッドがあります ( diskExpiryThreadIntervalSeconds)。ドキュメントを参照してください。そのため、キャッシュから取得した要素をチェックして、isExpired()有効期限が切れていないことを確認する必要があります。


したがって、最終的には次のようになります。

得る

Cache cache = CacheManager.getInstance().getCache(CACHE_NAME);
Element elem = cache.get(identifier);
if (elem == null) 
{
   throw new SessionNotFoundException(identifier);
}
if (elem.isExpired())
{
   throw new SessionExpiredException(identifier);  
}

return elem.getObjectValue();

置く

Cache cache = CacheManager.getInstance().getCache(CACHE_NAME);
// We use ttl = 0 and tti=<ttlInMinutes>, because session timeout is based on session idle timout.
element = new Element(identifier, new SessionElement(), Boolean.FALSE, (int) (timeToLive / VALUE_MS), 0);
cache.put(element);
于 2014-02-17T08:00:34.230 に答える