Search code examples
javatomcattransactionseclipselink

EclipseLink - ConcurrencyException - signalAttemptedBeforeWait


We've been working on an application that uses Tomcat 8 throught connection pool. We control Optimistic exceptions with @Version field, and we control transactions with Entitymanagers isolated by ThreadLocal.

However, the application triggers a concurrency exception sometimes with hangs other processes and requieres to restart the server.

The exception is always like this:

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) 

We've been trying to solve this problem or find any specific information about this error with no result. We even followed instructions in https://wiki.eclipse.org/EclipseLink/FAQ/JPA#How_to_diagnose_and_resolve_hangs_and_deadlocks.3F.

Disabling cache seems to solve the problem, but we cannt afford to not use cache due to performance needs.

Any help would be appreciated. Thanks


Solution

  • Finally, after six months of headaches, I managed to solve the problem.

    The general error was EclipseLink-2004. If you check Eclipselink error reference: Eclipse link error reference page, it says "Verify transactions in the application".

    I've been using a application managed Entity Managers. To control that transactions were single-thread I used this ManagerHelper class:

    EntityManagerHelper

    The problem was that I was putting a managed object inside a Session attribute. I don't really understand the process inside, but somehow it created new transactions outside the main transaction if it was used to query. Moving the object to Request attributes solved the problem.

    I hope this helps to someone in the future.

    Best regards