【问题标题】:ConcurrentModificationException when looping through lists from JPA in WebLogic从 WebLogic 中的 JPA 循环列表时出现 ConcurrentModificationException
【发布时间】: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


【解决方案1】:

可能无法迭代独立于迭代器同时变化的集合。

【讨论】:

  • 但这仍然需要更改任何循环通过列表的代码。
  • @SeverityOne,是的。也许可以尝试将相关实体(关系)注释为FetchType.EAGER。这将有助于急切地获取相关条目,但鉴于它是一个并发修改异常,我不确定这是否会有所帮助。如果您找到可行的解决方案,请进行更新。
猜你喜欢
  • 2012-04-06
  • 2021-12-15
  • 2013-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
相关资源
最近更新 更多