簡體   English   中英

Eclipselink拋出ConcurrentModificationException

[英]Eclipselink throwing ConcurrentModificationException

我在應用程序的代碼中遇到一些ConcurrentModificationException問題:

   Caused by: Exception [EclipseLink-2004] (Eclipse Persistence Services - 2.4.1.v20121003-ad44345): 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:489)
        at org.eclipse.persistence.internal.identitymaps.CacheKey.releaseReadLock(CacheKey.java:392)
        at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.cloneAndRegisterObject(UnitOfWorkImpl.java:1022)
        at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.cloneAndRegisterObject(UnitOfWorkImpl.java:933)
        at org.eclipse.persistence.internal.sessions.UnitOfWorkIdentityMapAccessor.getAndCloneCacheKeyFromParent(UnitOfWorkIdentityMapAccessor.java:197)
        at org.eclipse.persistence.internal.sessions.UnitOfWorkIdentityMapAccessor.getFromIdentityMap(UnitOfWorkIdentityMapAccessor.java:125)
        at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.registerExistingObject(UnitOfWorkImpl.java:3920)
        at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.registerExistingObject(UnitOfWorkImpl.java:3874)
        at org.eclipse.persistence.mappings.ObjectReferenceMapping.buildUnitofWorkCloneForPartObject(ObjectReferenceMapping.java:109)
        at org.eclipse.persistence.mappings.ObjectReferenceMapping.buildCloneForPartObject(ObjectReferenceMapping.java:71)
        at org.eclipse.persistence.internal.indirection.UnitOfWorkQueryValueHolder.buildCloneFor(UnitOfWorkQueryValueHolder.java:56)
        at org.eclipse.persistence.internal.indirection.UnitOfWorkValueHolder.instantiateImpl(UnitOfWorkValueHolder.java:161)
        at org.eclipse.persistence.internal.indirection.UnitOfWorkValueHolder.instantiate(UnitOfWorkValueHolder.java:222)
        at org.eclipse.persistence.internal.indirection.DatabaseValueHolder.getValue(DatabaseValueHolder.java:88)

解析代碼,我發現負責提供EntityManager的類:

import javax.ejb.Stateful;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import weblogic.javaee.CallByReference;

@Stateful (name = "DAOFactoryRemoteBean", mappedName = "DAOFactoryRemoteBean")
@CallByReference
public class DAOFactoryRemoteImplBean implements DAOFactoryRemoteBean {

    @PersistenceContext(unitName = "server_unit")
    private EntityManager em;

    private static String getDAOName(Class<?> classeEntidade) {
        String result = classeEntidade.getName()
            .replace("org.networkmap.server.bean.",
            "org.networkmap.server.bean.dao.");
        result = result.concat("DAO");
        return result;
    }

    @Override
    public Object getDAO(Class<?> entityClass) {
        NetworkmapDao result = null;

        try {
           result = (NetworkmapDao) Class.forName(getDAOName(entityClass))
               .newInstance();
           result.setEntityManager(em);
        } catch (Exception e) {
           e.printStackTrace();
        }
        return result;
    }
}

有很多EJB調用getDAO方法。 和應用程序的很多用戶。 我想這可能會導致並發問題。

我對此沒有很好的專業知識,但根據互聯網上的一些搜索,似乎對該代碼沒有好的做法,因為EntityManger不是線程安全的。 我遇到了這個問題:(

該應用程序使用EclipseLink v2.4.2 API,通過Solaris OS在Weblogic 10.3.5上運行,並且在persistence.xml上只聲明了一個persitent單元。

請有人幫助我。

您是否使用相同的EntityManager與不同的線程? 如果是這樣,那就不要那樣做了。

否則,請包含完整的異常堆棧跟蹤。

什么,“result.setEntityManager(em);” 做?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM