2014-04-22 95 views
2

我在應用程序中遇到緩存死鎖問題,同時使用RMI緩存複製器策略。 以下是異常日誌:EhCache使用RMI緩存複製器時發生死鎖問題

net.sf.ehcache.transaction.DeadLockException: deadlock detected in cache [abcCache] on key [1] between current transaction [139003] and foreign transaction [138998] 

at net.sf.ehcache.transaction.local.LocalTransactionStore.put(LocalTransactionStore.java:200) 
at net.sf.ehcache.transaction.local.JtaLocalTransactionStore.put(JtaLocalTransactionStore.java:268) 
at net.sf.ehcache.Cache.putInternal(Cache.java:1434) 
at net.sf.ehcache.Cache.put(Cache.java:1367) 
at net.sf.ehcache.Cache.put(Cache.java:1339) 

以下是我的Ehcache配置與RMI同步:

<transactionManagerLookup 
    class="net.sf.ehcache.transaction.manager.DefaultTransactionManagerLookup" 
    properties="jndiName=java:comp/UserTransaction" propertySeparator=";"/> 

<cacheManagerPeerProviderFactory 
    class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory" 
    properties="peerDiscovery=automatic, multicastGroupAddress=x.x.x.x, multicastGroupPort=xxxx, timeToLive=32"/>          

<cacheManagerPeerListenerFactory 
    class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory" 
    properties="port=40001, socketTimeoutMillis=2000"/> 

<cache 
    name="abcCache" 
    maxElementsInMemory="100" 
    eternal="false" 
    overflowToDisk="false" 
    diskPersistent="false" 
    timeToIdleSeconds="0" 
    timeToLiveSeconds="86400" 
    memoryStoreEvictionPolicy="LRU" 
    transactionalMode="xa"> 
    <cacheEventListenerFactory 
     class="net.sf.ehcache.distribution.RMICacheReplicatorFactory" 
     properties="replicatePuts=true, replicateUpdates=true, replicateRemovals=true, replicateUpdatesViaCopy=false, replicateAsynchronously=true, asynchronousReplicationIntervalMillis=500"/> 
</cache> 

我使用ehcache-core ver 2.4.3。 感謝任何幫助。

回答

1

這可能不是您正在尋找的答案,但RMI複製和事務性緩存不支持在一起。現在,DeadLock的原因不一定是RMI複製。你可以在這裏閱讀不同的交易模式:http://ehcache.org/documentation/apis/transactions 但基本上,除了在xa_strict環境中,你可能會得到這些。因此,如果這是您不願意支付的價格,則需要確保所有交易在超時之前設法訪問條目(即,長時間停留可以解決您的問題)。 本地事務高速緩存將在該超時期限內無法「鎖定」條目時拋出異常,因爲它當前被另一個事務/線程鎖定。希望這是有道理的。