2013-08-07 2 views
0

내가 응용 프로그램의 코드에서 일부 ConcurrentModificationException에 문제가있어 던지는 :은 EclipseLink는 해, 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) 

코드를 Analising를, 나는 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; 
    } 
} 

getDAO 메서드를 호출하는 EJB가 많이 있습니다. 그리고 많은 사용자가 앱을 사용합니다. 나는 그것이 실제로 동시 문제를 일으키는 원인이 될지도 모른다 짐작한다.

저는 전문 지식이 없지만 인터넷 검색에 따르면 EntityManger은 스레드로부터 안전하지 않다는 점을 고려할 때 코드에 대한 우수 사례가없는 것 같습니다. 나는이 문제 :(

앱에의하여 EclipseLink v2.4.2 API를 사용하는 솔라리스 OS를 통해 웹 로직 10.3.5에서 실행 persistence.xml에 선언 된 하나의 persitent 단위 거기에 붙어있어.

하십시오 사람 도와주세요.

+0

여기서 관련성이있는 코드 경로는 EJB에 대한 특정 진입 점 (일부 메소드)과 해당 메소드가 트랜잭션 관리자에 직접 및 간접적으로 액세스하는 방법 (힌트 : 안됨)과 엔티티 관리자입니다. 또한 예외가 실제로 트리거되는 코드의 점을 식별하기위한 스택 추적 (코드 경로에서 이미 논의 됨)이 충분합니다. 그 중 아무 것도 여기에 제공되지 않습니다. –

답변

1

서로 다른 스레드와 같은 EntityManager를 사용하고 있습니까? 그렇다면, 그렇게하지 않습니다. 그렇지 않으면

전체 예외 스택 추적을 포함시켜주십시오. "결과를 무엇

을 .se tEntityManager (em); "할까요?

+0

'NetworkmapDao'는 모든 DAO가 확장하는 추상 클래스입니다. 'setEntityManager (em)'는 각 DAO에 엔티티 관리자에 대한 참조를 설정합니다. 그렇다면 스레드가 많은 경우에 가장 좋은 방법은 무엇입니까? – elias

관련 문제