在 WebLogic 中从 JPA 循环遍历列表时出现 ConcurrentModificationException

问题描述

当循环访问来自 WebLogic 中的 JPA 查询List 时,只要遍历此列表,应用程序就会抛出一个 ConcurrentModificationException

Caused By: java.util.ConcurrentModificationException
        at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
        at java.util.ArrayList$Itr.next(ArrayList.java:859)
(rest of stack trace omitted)

代码如下:

final List<SomeEntity> someEntities = someEntityDao.getAllMatchingSomeCriteria();
for (final SomeEntity someEntity : someEntities ) {
    // ...
}

请务必注意,列表 someEntities以任何方式、形状或形式被代码修改。相反,我得出的结论是,WebLogic 仍在一个单独的线程中填充列表,而主线程已经在遍历它。

可以这样解决

final List<SomeEntity> someEntities = new ArrayList<>(someEntityDao.getAllMatchingSomeCriteria());
for (final SomeEntity someEntity : someEntities ) {
    // ...
}

但这意味着必须完成所有代码,这是最后的手段。有没有办法让 WebLogic 停止尝试变得聪明?

解决方法

可能无法对同时发生变化的集合进行迭代,而不受迭代器的影响。