我们有一个使用 Eclipselink weaving 和 JPA 的应用程序。假设我们有一个 Family 对象,它与 Person 对象具有一对多的关系。我们从数据库中检索一组 Person 对象,然后使用 Java 8 Streams 和 spliterator 并行处理 Person 对象。我们最终得到一个 NullPointerException,从 Eclipselink 代码中查看,该异常似乎是由两个线程在不同的 Person 对象上操作但试图同时实例化同一个 Family 克隆对象引起的。
从谷歌搜索看来,以这种方式使用编织和延迟加载的 Eclipselink 不是线程安全的,这是正确的吗?如果是这样,在保留一定程度并行性的同时处理此问题的最佳方法是什么?
谢谢
大卫
最佳答案
描述不清楚 - 您是否正在读取单个 Person 实例,然后在不同线程之间共享它?
从单个 EntityManager 读取的对象不是线程安全的 - 它们由该 EntityManager 管理和跟踪,这意味着代表单个进程的工作单元。每个线程都需要从自己的EntityManager中读取对象;它被配置为从共享缓存中复制实体。否则,如果您需要缓存一个对象以在不同线程之间使用,您可以确保提取整个图或自己在延迟提取的部分上添加同步。
关于java - 将 Eclipselink 与 Streams 结合使用会产生 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62217542/