前文
セッション管理の実装として ehCache を使用する予定ですが、既に提供されている、おそらくより適切なセッションの実装を万が一使用できない場合は、まず確認してください。Web コンテナーまたは完全な jee サーバーを使用している場合は、最初にこれを試してください。
どうして
わかった。あなたはそれを正しい簡単な方法でやらないことは間違いありません。セッションに ehCache を使用する理由について、いくつかのヒントを示します。
- サービスは jee サーバー/Web コンテナーの一部ではありません。
- サービスはステートレスですが、状態 (フレームワーク コード) が必要になる場合があります。
- あなたと識別可能なクライアントの間のプロキシのために呼び出しを区別することはできません.
- あなたはRTFMをしなかっただけで、あなたのやり方でやりたいと思っています。
1 については、jetty のような Web コンテナーがオプションであるかどうかを確認してください。セッション全体の Web アクセスを使用しても、ポップアップは表示されません。
2 については、Apache Shiroが希望どおりに動作しないかどうかを確認してください。そうでない場合は、ehCache があなたの味方になる可能性があります。
クラブへようこそ。
4 については、まあ、マニュアルを読まないと、これも読まないでしょう。
方法
ehCache を使用してセッション管理を実装する場合は、データがシリアライズ可能であることを確認してください。これにより、問題が軽減され、ehCache の機密性の高い機能を使用できるようになります。つまり、ディスクへの永続性、ノードのキャッシュ、これからの回復などです。
すべてのセッションにキャッシュを使用するのではなく、すべてのセッションに1 つのキャッシュを使用してください。はsessionId
キャッシュのキーで、値はMap
. 並行性を忘れないでください (ajax 呼び出しを考えてください)。ConcurrentHashMap
fromを使用するのが最善かもしれません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
タイムアウトさせるために使用します。要素に特定の値を設定して後で追加できるため、 timeToIdleSeconds
and を気にしないでください。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);