2016-08-21 5 views
1

私はehcacheを使用してユーザーセッションを制御していますが、毎回、ユーザーログイン時にこのエラーがログに記録されます。getKeysWithExpiryCheck()メソッドを使用するとehcacheのkeySetがタイムアウトしました

net.sf.ehcache.constructs.nonstop.NonStopCacheException: keySet timed out 
    at net.sf.ehcache.constructs.nonstop.concurrency.NonStopCacheKeySet$NonStopCacheKeySetIterator$1.performClusterOperationTimedOut(NonStopCacheKeySet.java:103) 
    at net.sf.ehcache.constructs.nonstop.concurrency.NonStopCacheKeySet$NonStopCacheKeySetIterator$1.performClusterOperationTimedOut(NonStopCacheKeySet.java:96) 
    at net.sf.ehcache.constructs.nonstop.store.ExecutorServiceStore.executeClusterOperation(ExecutorServiceStore.java:1187) 
    at net.sf.ehcache.constructs.nonstop.store.NonstopStoreImpl.executeClusterOperation(NonstopStoreImpl.java:704) 
    at net.sf.ehcache.constructs.nonstop.concurrency.NonStopCacheKeySet$NonStopCacheKeySetIterator.<init>(NonStopCacheKeySet.java:96) 
    at net.sf.ehcache.constructs.nonstop.concurrency.NonStopCacheKeySet.iterator(NonStopCacheKeySet.java:56) 
    at net.sf.ehcache.Cache.getKeysWithExpiryCheck(v.java:1906) 
... 

official ehcache doucmentationは言う:「この方法は非常に長い時間がかかるので、キャッシュの設定によっては、ご利用が期限切れのキーのチェックが必要かどうかを考えてみましょう...」。

私は実際には、20000msが私には十分すぎるように見えるにもかかわらず、このエラーを止めるために増やすべきecache.xmlのタイムアウトがわかりません。ドキュメントには、取られた時間が1000エントリあたり約200ms 。

これは、使用されるehcache.xmlです。

<?xml version="1.0" encoding="UTF-8"?> 

<ehcache name="RelianceCache" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd"> 


    <cache name="READ_USERS_CACHE" maxElementsInMemory="0" eternal="true" overflowToDisk="false"> 
     <terracotta clustered="true" valueMode="serialization" consistency="strong"> 
      <nonstop immediateTimeout="false" timeoutMillis="20000"> 
       <timeoutBehavior type="exception" /> 
      </nonstop> 
     </terracotta> 
    </cache> 


    <terracottaConfig url="TSA_SERVERS:TSA_PORT" rejoin="true" /> 
</ehcache> 

編集: the NonStopCacheKeySet implementationを参照してください、エラーが方法NonStopCacheKeySetIteratorでスローされています。

+0

この場合、キャッシュのサイズに関する情報を提供できますか?または、アプリケーションのライフサイクルをTerracottaサーバーの開始と比較しますか? –

+0

このキャッシュにはログインしているユーザーが含まれているため、サイズを100未満にすることができます。私は本当にテラコッタのサーバーに比べて私のアプリのライフサイクルで何を意味するか分からない。 – QuakeCore

+0

元の例外原因が失われたため、ehcache-core-2.6.8.jarにいくつかのデバッグメッセージを追加しました。 – QuakeCore

答えて

0

タイムアウトを長くしても問題は解決しません。 100のエントリのための20秒は異常に長いです。

アプリケーションのロジックから見て適切な場合は、timeoutBehaviorをtimeoutBehavior="localReadsAndExceptionOnWrite"に変更することを検討します。 localCacheEnabledプロパティはデフォルト値のTRUEでなければならないことに注意してください。

... 
    <terracotta clustered="true" localCacheEnabled="true" valueMode="serialization" consistency="strong"> 
     <nonstop immediateTimeout="false" timeoutMillis="20000"> 
      <timeoutBehavior type="localReadsAndExceptionOnWrite" /> 
     </nonstop> 
    </terracotta> 
    ... 

別の解決策は、デフォルト値consistency ="eventual"に一貫性を変更することができます。これはおそらくこの問題を解決しますが、キャッシュによって戻された一時的で古いデータにつながる可能性があります。


ドキュメントには、「あなたの使用に期限切れのキーのチェックが必要かどうかを検討する」と記載されています。キーのリストを反復処理する代わりにCache.getKey()を使用するようにアプリケーションロジックを調整することは可能でしょうか?

関連する問題