Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa Eclipselink-em.find时ConcurrentModification异常_Jpa_Eclipselink_Concurrentmodification - Fatal编程技术网

Jpa Eclipselink-em.find时ConcurrentModification异常

Jpa Eclipselink-em.find时ConcurrentModification异常,jpa,eclipselink,concurrentmodification,Jpa,Eclipselink,Concurrentmodification,偶尔使用EntityManager.find或Query.getResultList方法对实体执行读取操作时,我遇到ConcurrentModificationException。我正在为EclipseLink使用版本2.3.2。在从帖子中获得线索后,我已经删除了显式EntityManager refresh和flush,并且行为没有变化,我仍然得到以下异常 StrackTrace看起来像这样: Caused by: java.util.ConcurrentModificationExcepti

偶尔使用EntityManager.find或Query.getResultList方法对实体执行读取操作时,我遇到ConcurrentModificationException。我正在为EclipseLink使用版本2.3.2。在从帖子中获得线索后,我已经删除了显式EntityManager refresh和flush,并且行为没有变化,我仍然得到以下异常

StrackTrace看起来像这样:

Caused by: java.util.ConcurrentModificationException
        at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
        at java.util.AbstractList$Itr.next(AbstractList.java:343)
        at org.eclipse.persistence.internal.queries.InterfaceContainerPolicy.next(InterfaceContainerPolicy.java:274)
        at org.eclipse.persistence.internal.queries.ContainerPolicy.next(ContainerPolicy.java:1116)
        at org.eclipse.persistence.internal.helper.WriteLockManager.traverseRelatedLocks(WriteLockManager.java:199)
        at org.eclipse.persistence.internal.helper.WriteLockManager.acquireLockAndRelatedLocks(WriteLockManager.java:144)
        at org.eclipse.persistence.internal.helper.WriteLockManager.checkAndLockObject(WriteLockManager.java:449)
        at org.eclipse.persistence.internal.helper.WriteLockManager.traverseRelatedLocks(WriteLockManager.java:213)
        at org.eclipse.persistence.internal.helper.WriteLockManager.acquireLockAndRelatedLocks(WriteLockManager.java:144)
        at org.eclipse.persistence.internal.helper.WriteLockManager.acquireLocksForClone(WriteLockManager.java:75)
        at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.cloneAndRegisterObject(UnitOfWorkImpl.java:971)
        at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.cloneAndRegisterObject(UnitOfWorkImpl.java:929)
        at org.eclipse.persistence.internal.sessions.UnitOfWorkIdentityMapAccessor.getAndCloneCacheKeyFromParent(UnitOfWorkIdentityMapAccessor.java:181)
        at org.eclipse.persistence.internal.sessions.UnitOfWorkIdentityMapAccessor.getFromIdentityMap(UnitOfWorkIdentityMapAccessor.java:120)
        at org.eclipse.persistence.internal.sessions.IdentityMapAccessor.getFromIdentityMap(IdentityMapAccessor.java:380)
        at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.registerExistingObject(UnitOfWorkImpl.java:3899)
        at org.eclipse.persistence.queries.ObjectBuildingQuery.registerIndividualResult(ObjectBuildingQuery.java:400)
        at org.eclipse.persistence.queries.ReadObjectQuery.registerResultInUnitOfWork(ReadObjectQuery.java:780)
        at org.eclipse.persistence.queries.ObjectLevelReadQuery.checkEarlyReturn(ObjectLevelReadQuery.java:802)
        at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:781)
        at org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:1040)
        at org.eclipse.persistence.queries.ReadObjectQuery.execute(ReadObjectQuery.java:418)
        at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:1128)
        at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2871)
        at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1516)
        at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1498)
        at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1463)
        at org.eclipse.persistence.internal.jpa.EJBQueryImpl.executeReadQuery(EJBQueryImpl.java:485)
        at org.eclipse.persistence.internal.jpa.EJBQueryImpl.getResultList(EJBQueryImpl.java:734)

下面是我的类在随机时间抛出ConcurrentModificationException的样子,没有明确的步骤来重现这个问题。还有其他方法

@Stateless
@Local
@EJB(name = "java:global/framework/admin/AdminServicePersistence", beanInterface = AdminrServicePersistence.class) 
public class AdminServicePersistenceImpl implements AdminServicePersistence {

    @PersistenceContext(unitName = "AdminServicePU")
    protected EntityManager em;

    protected void setEntityManager(EntityManager em) {
        this.em = em;
    } 

    @Override
    public AdminPE findAdminById(final Long id, final boolean refresh)    throws AdminServiceModuleException {
        try {
            final TypedQuery<AdminPE> query = em.createNamedQuery(AdminPE.ADMIN_BY_ID, AdminPE.class);
            query.setParameter("id", id);
            if(refresh) {
                query.setHint(QueryHints.REFRESH, HintValues.TRUE);
            }
            return executeSingleResultQuery(query);
        } catch (Exception exc) {
            throw new AdminServiceModuleException(AdminError.PERSISTENCE_QUERY_ERROR, exc);
        }        
    }
}   
@无状态
@本地的
@EJB(name=“java:global/framework/admin/AdminServicePersistence”,beanInterface=AdminServicePersistence.class)
公共类AdminServicePersistenceImpl实现AdminServicePersistence{
@PersistenceContext(unitName=“AdminServicePU”)
受保护的实体管理器em;
受保护的无效设置EntityManager(EntityManager em){
this.em=em;
} 
@凌驾
公共AdminPE findAdminById(最终长id,最终布尔刷新)引发AdminServiceModuleException{
试一试{
final TypedQuery query=em.createNamedQuery(AdminPE.ADMIN\u BY\u ID,AdminPE.class);
query.setParameter(“id”,id);
如果(刷新){
setHint(QueryHints.REFRESH,hintValue.TRUE);
}
返回executeSingleResultQuery(查询);
}捕获(异常exc){
抛出新的AdminServiceModuleException(AdminError.PERSISTENCE\u QUERY\u ERROR,exc);
}        
}
}   

您是否在多线程中使用EntityManager?我能看到这种情况的唯一方法是,如果EntityManager在不同线程之间以某种方式被重用,则每个线程都需要自己的EntityManager和查询实例。@Chris,我同意你的观点,即只有当不同的线程使用同一个EntityManager实例时,才会发生这种情况。我相信我的情况并非如此,而且这只是随机发生的。我个人希望框架“Eclipselink”能够处理这个并发问题。您是否在其他线程中使用只读实例或任何其他优化?@Chris No实际上不是。我可以说,这种情况在我删除东西的时候发生得更频繁,中间有从数据库获取数据的查询,所有这些都是单个事务的一部分。结果证明,管理实体与组实体之间存在双向多对多关系,这导致了这种异常的发生。当我禁用关系时,一切都会正常工作:(。