我们一直在开发一个通过连接池使用 Tomcat 8 的应用程序。我们通过@Version 字段控制 Optimistic 异常,我们通过 ThreadLocal 隔离的 Entitymanagers 控制事务。
但是,应用程序有时会触发并发异常并挂起其他进程并需要重新启动服务器。
异常总是这样:
Caused by: Exception [EclipseLink-2004] (Eclipse Persistence Services - 2.6.4.v20160829-44060b6):
org.eclipse.persistence.exceptions.ConcurrencyException
Exception Description: A signal was attempted before wait() on ConcurrencyManager. This normally means that an attempt was made to commit or rollback a transaction before it was started, or to rollback a transaction twice.
at org.eclipse.persistence.exceptions.ConcurrencyException.signalAttemptedBeforeWait(ConcurrencyException.java:84)
at org.eclipse.persistence.internal.helper.ConcurrencyManager.releaseReadLock(ConcurrencyManager.java:468)
at org.eclipse.persistence.internal.identitymaps.CacheKey.releaseReadLock(CacheKey.java:475)
我们一直在尝试解决此问题或查找有关此错误的任何具体信息,但没有结果。我们甚至按照 https://wiki.eclipse.org/EclipseLink/FAQ/JPA#How_to_diagnose_and_resolve_hangs_and_deadlocks.3F 中的说明进行操作.
禁用缓存似乎可以解决问题,但由于性能需要,我们不能不使用缓存。
如有任何帮助,我们将不胜感激。 谢谢
最佳答案
终于,经过六个月的头痛,我终于解决了这个问题。
一般错误是 EclipseLink-2004。如果检查 Eclipselink 错误引用: Eclipse link error reference page ,它显示“验证应用程序中的交易”。
我一直在使用应用程序管理的实体管理器。为了控制事务是单线程的,我使用了这个 ManagerHelper 类:
问题是我将托管对象放在 Session 属性中。里面的流程我不是很懂,但是如果用它来查询,不知怎么的,它在主事务之外创建了新的事务。将对象移动到 Request 属性解决了这个问题。
我希望这对以后的人有所帮助。
最好的问候
关于java - EclipseLink - 并发异常 - signalAttemptedBeforeWait,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40964893/