2011-10-09 21 views
6

私のプロジェクトでは、ehcacheを使用してユーザーの詳細やその他の情報を格納しています(dbからフェッチするのではなく、実行時にこれを使用します)。以下は私のehcacheを構成です:Ehcacheを使用したWebAppセッション管理

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

しかし、問題は起こった時間のセッションタイムアウト(でも、ユーザは> 30、よりアクティブではない)のほとんどです。場合によっては10分かかる場合があります...

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

ehcacheが有効期限を決定する方法がわかりません。

+0

こんにちはランキをGET:


だから、最後に、あなたはこのようなものになってしまいますehcacheを実装するための良い指針がありますかまたはそれのためのチュートリアルもしそうなら、私にそれのリンクを提供してください。 –

+0

あなたはどのアプリケーションサーバーを使用していますか? –

答えて

1

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

maxElementsInMemoryが50000です。ある時点で50000に達している可能性があります。したがって、overflowToDiskをfalseに設定すると、最近使用された最小のエントリが削除されます。

5

Ehcacheのは、次のいずれかの条件が満たされているキャッシュからオブジェクトを追い出す:

  1. オブジェクトは、以上timeToIdle秒(読み取りまたは更新)にehcacheからアクセスされていません。 timeToIdleが設定されていない場合、このルールは適用されません。言い換えれば、オブジェクトは、timeToIdleが設定されていないときに、キャッシュから決してアクセス(読み取りまたは更新)されなくても、無限時間キャッシュに残る資格があります。

  2. オブジェクトがtimeToLive秒を超えてキャッシュに入っています。 timeToLiveが設定されていない場合、このルールは適用されません。言い換えれば、オブジェクトは無限の時間キャッシュに留まる資格があります。

  3. キャッシュ内のアイテムの数がmaxElementsInMemoryに達しました。この場合、memoryStoreEvictionPolicyが動作し、キャッシュ内の要素数がmaxElementsInMemory以下になるまで、エビクションポリシーに一致する要素が削除されます。これらの項目は、条件1および2に従ってキャッシュに登録されています

希望を明確にしてください。

0

前文私はあなたが万が一、既に提供され、おそらくより適したセッションの実装を使用することができない場合は、セッション管理の実装最初のチェックなどにehcacheを使用するように滑走している

。あなたはWebコンテナまたは完全な果肉JEEサーバを使用している場合、あなたは本当にこの最初の


なぜ

オーケーを試してみてください。あなたはそれを正しい簡単なやり方ではないと確信しています。ここにいくつかのヒントがあります。なぜ、あなたはセッションのためにehCacheを使いたいのですか?

  1. あなたのサービスは、jeeサーバ/ Webコンテナの一部ではありません。
  2. サービスはステートレスですが、時には状態(フレームワークコード)が必要です。
  3. あなたと区別できるクライアントとの間のプロキシのためにコールを区別することはできません。たとえば、サービス/サービスのミドルウェアのようなもので、デフォルトでは区別可能なデータは提供されませんが、userIdやsessionId 。
  4. あなたはRTFMを実行しておらず、やりたいと思っています。

1については、桟橋のようなウェブコンテナがオプションであるかどうかを確認してください。あなたは確かに、あなたのためにポップアップしないセッション全体のWebアクセスを使用します。

2については、Apache Shiroがあなたの望むことをしないかどうかを確認してください。そうでなければ、ehCacheはあなたの友人かもしれません。

3人はクラブにようこそ。

4 ...あなたがマニュアルを読んでいないのであれば、これも読まないでしょう。あなたはEhcacheのを使用してセッション管理を実装する場合は、あなたのデータは直列化可能であることを確認してくださいどのように


。これにより、問題が軽減され、ehCacheの機密機能を使用できるようになります。ディスクへの永続性、ノードのキャッシング、これからの回復などが含まれます。

do はすべてのセッションでキャッシュを使用しますが、はすべてキャッシュです。 sessionIdがキャッシュのキーで、値はMapになります。並行性を忘れないでください(ajax呼び出しを考えてください)。 java.util.concurrentからConcurrentHashMapを使用するのが最善の方法です。しかし、たぶんあなたはDr Heinz M. Kabutzであり、もっとクールな方法でそれを見つけることができます。

私は、ストレージに保管するための要素の量よりもむしろサイズを使用することが非常に有用であることを発見しました。あなたは、後でどのデータ/オブジェクトが格納されるかわからないかもしれません。永続化戦略を設定することを忘れないでください。ここで一時フォルダへの格納を使用しました。

<?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を使用します。 timeToIdleSecondstimeToLiveSecondsは、後で追加する要素に特定の値を設定できるので気にしないでください。有効期限の

立ち退き

つのノート。構成された時間のために、メモリ内の要素は絶対に追い出されません。定義されたメモリ制約がヒットするまで、メモリは構築されます。したがって、100要素を定義すると、101要素が追加された場合、memoryStoreEvictionPolicyがトリガーになり、1要素がこの構成でディスクにフラッシュされます(ehCache 2.2)。ディスクストレージの場合、有効期限(diskExpiryThreadIntervalSeconds)のスレッドがチェックされます。 documentationを参照してください。 したがって、有効期限が切れていないことを確認するために、取り出された要素を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(); 

PUT

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);