EclipseLink - 并发异常 - signalAttemptedBeforeWait
EclipseLink - ConcurrencyException - signalAttemptedBeforeWait
我们一直在开发一个使用 Tomcat 8 throught 连接池的应用程序。我们用@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,它表示 "Verify transactions in the application"。
我一直在使用应用程序管理的实体管理器。为了控制事务是单线程的,我使用了这个 ManagerHelper class:
问题是我将托管对象放入 Session 属性中。里面的流程我不是很懂,但是如果用它来查询,不知怎么的,它在主事务之外创建了新的事务。将对象移动到 Request 属性解决了问题。
我希望这对以后的人有所帮助。
此致
我们一直在开发一个使用 Tomcat 8 throught 连接池的应用程序。我们用@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,它表示 "Verify transactions in the application"。
我一直在使用应用程序管理的实体管理器。为了控制事务是单线程的,我使用了这个 ManagerHelper class:
问题是我将托管对象放入 Session 属性中。里面的流程我不是很懂,但是如果用它来查询,不知怎么的,它在主事务之外创建了新的事务。将对象移动到 Request 属性解决了问题。
我希望这对以后的人有所帮助。
此致