简体   繁体   English

使用RMI缓存复制器时出现EhCache死锁问题

[英]EhCache Deadlock issue while using RMI Cache Replicator

I am facing the cache deadlock issue in my application while RMI Cache Replicator strategy. 我在使用RMI缓存复制器策略时遇到应用程序中的缓存死锁问题。 Following is the exception log: 以下是异常日志:

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)

Following is my ehcache configuration with RMI synchronization: 以下是我的带有RMI同步的ehcache配置:

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

I am using ehcache-core ver 2.4.3 . 我正在使用ehcache-core ver 2.4.3 Appreciate any help. 感谢任何帮助。

This might not be the answer you are looking for, but RMI replication and transactional caches aren't supported together. 这可能不是您要找的答案,但是RMI复制和事务性缓存不一起支持。 Now, the reason for the DeadLock isn't necessarily the RMI replication though. 现在,DeadLock的原因不一定是RMI复制。 You can read on the different transactional modes here: http://ehcache.org/documentation/apis/transactions But basically, other than in an xa_strict environment, you might get these. 您可以在这里阅读不同的事务处理模式: http ://ehcache.org/documentation/apis/transactions但是,基本上,除了在xa_strict环境中,您可能会得到这些。 So if that's a price you're not willing to pay, you need to make sure all transactions manage to access an entry prior to timing out (ie having a long time out would solve your problem). 因此,如果这是您不愿意支付的价格,则需要确保所有事务在超时之前都能设法访问条目(即长时间超时将解决您的问题)。 The xa & local transaction caches will throw the exception if they can't "lock" the entry within that timeout period, because it's currently locked by another transaction/thread. 如果xa&本地事务缓存不能在该超时时间内“锁定”该条目,则将引发异常,因为该条目当前已被另一个事务/线程锁定。 Hope this makes sense. 希望这是有道理的。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM