Eclipselink适用于缓存协调的最佳缓存设置。更新:使用SEND_NEW_OBJECTS_WITH_CHANGES时导致死锁

时间:2017-08-21 15:22:20

标签: jpa caching jms eclipselink

我的技术堆栈

  

EclipseLink 2.6.3,JPA 2.0,IBM Websphere 8.5.5.8和JTA启用

目前,在我的项目中,我启用了SHARED_CACHE模式,并在所有非读取实体上设置了以下缓存设置,而CacheType为 SOFT_WEAK

@Cacheable
@Cache(
        alwaysRefresh=true,
        refreshOnlyIfNewer=true,
        coordinationType=CacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES,
        expiry=3600000 //changed according to entity
        )

我还配置了JMS缓存协调,因为我的应用程序托管在集群环境中。

我的问题是我的缓存设置是否与EclipseLink最佳实践一致,符合缓存协调的原因?

除了上面提到的,我还需要改变什么吗?

更新

现在我遇到了这个缓存协调设置的问题,即CacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES,它进入死锁模式并最终锁定线程,我的服务器崩溃。不知道这里发生了什么。我调试了源代码,它显示它获取了线程和放大器的锁定。用于合并更改的对象的缓存,但这应该在最短的时间内发生。为什么锁要释放需要10分钟?

任何帮助都将不胜感激。

以下是我在QA / Prod环境中遇到的错误。

    [14/09/17 13:37:16:015 BST] 000003d4 SystemOut     O [EL Finer]: 2017-09-14 13:37:16.014--ServerSession(772764452)--Thread(Thread[SIBJMSRAThreadPool : 7,5,main])--


Potential deadlock encountered while thread: SIBJMSRAThreadPool : 7 attempted to lock object of class: class com.jlr.vista.business.order.model.event.StatusUpdateEvent with id: 324,836,575, entering deadlock avoidance algorithm.  This is a notice only.
[14/09/17 13:47:16:015 BST] 000003d4 SystemOut     O [EL Severe]: 2017-09-14 13:47:16.015--ServerSession(772764452)--Thread(Thread[SIBJMSRAThreadPool : 7,5,main])--MAX TIME 600 seconds EXCEEDED FOR WRITELOCKMANAGER WAIT.  Waiting on Entity type: com.business.model.event.UpdateEvent with pk: 324,836,575 currently locked by thread: SIBJMSRAThreadPool : 1 with the following trace:
                atsun.misc.Unsafe.park(Native Method)
                atjava.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:237)
                atjava.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2187)
                atcom.ibm.ws.util.BoundedBuffer$GetQueueLock.await(BoundedBuffer.java:286)
                atcom.ibm.ws.util.BoundedBuffer.waitGet_(BoundedBuffer.java:425)
                atcom.ibm.ws.util.BoundedBuffer.take(BoundedBuffer.java:823)
                atcom.ibm.ws.util.ThreadPool.getTask(ThreadPool.java:1059)
                atcom.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1916)
 (There is no English translation for this message.)

注意:我的应用程序非常庞大,并且有近150个可写的实体。

0 个答案:

没有答案