我们一直致力于使用Tomcat 8连接池的应用程序。我们使用@Version字段控制乐观异常,并且我们使用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中的说明进行操作。
禁用缓存似乎可以解决问题,但由于性能需求,我们无法使用缓存。
任何帮助将不胜感激。 感谢
答案 0 :(得分:0)
最后,经过六个月的头痛,我设法解决了这个问题。
一般错误是 EclipseLink-2004 。如果您检查Eclipselink错误参考: Eclipse link error reference page,它说"验证应用程序中的交易"。
我一直在使用应用程序管理的实体经理。为了控制那些事务是单线程,我使用了这个ManagerHelper类:
问题在于我将托管对象放在 Session 属性中。我不太了解内部流程,但如果用于查询,它会以某种方式在主事务之外创建新事务。将对象移动到请求属性可以解决问题。
我希望将来对某人有所帮助。
祝你好运