내가 응용 프로그램의 코드에서 일부 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 단위 거기에 붙어있어.
하십시오 사람 도와주세요.
여기서 관련성이있는 코드 경로는 EJB에 대한 특정 진입 점 (일부 메소드)과 해당 메소드가 트랜잭션 관리자에 직접 및 간접적으로 액세스하는 방법 (힌트 : 안됨)과 엔티티 관리자입니다. 또한 예외가 실제로 트리거되는 코드의 점을 식별하기위한 스택 추적 (코드 경로에서 이미 논의 됨)이 충분합니다. 그 중 아무 것도 여기에 제공되지 않습니다. –