【发布时间】:2021-02-01 07:38:13
【问题描述】:
循环访问来自 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 停止自作聪明?
【问题讨论】:
-
你能分享完整的堆栈跟踪吗? WebLogic Server 不使用单独的线程来填充集合。
标签: java jpa weblogic concurrentmodification