【问题标题】:Using Eclipselink with Streams gives NullPointerException将 Eclipselink 与 Streams 一起使用会产生 NullPointerException
【发布时间】:2020-06-05 14:21:39
【问题描述】:

我们有一个使用 Eclipselink 编织和 JPA 的应用程序。假设我们有一个 Family 对象,它与 Person 对象具有一对多的关系。我们从数据库中检索一组 Person 对象,然后使用 Java 8 Streams 和拆分器并行处理 Person 对象。我们最终得到一个 NullPointerException,它在 Eclipselink 代码中四处寻找,似乎是由两个线程在不同的 Person 对象上运行但试图同时实例化同一个 Family 克隆对象引起的。

从谷歌搜索看来,Eclipselink 以这种方式使用编织和延迟加载不是线程安全的,对吗?如果是这样,在保持一定程度的并行化的同时处理这个问题的最佳方法是什么?

谢谢,

大卫

【问题讨论】:

    标签: java jpa eclipselink


    【解决方案1】:

    从描述中不清楚 - 您是在读取单个 Person 实例,然后在不同线程之间共享它吗?

    从单个 EntityManager 读取的对象不是线程安全的 - 它们由 EntityManager 管理和跟踪,该 EntityManager 表示单个进程的工作单元。每个线程都需要从自己的 EntityManager 中读取对象;这被配置为从共享缓存中复制实体。否则,如果您需要缓存一个对象以供不同线程之间使用,您可以确保获取整个图或自己在延迟获取的部分上添加同步。

    【讨论】:

    • 我们有线程 A 访问人 A 和线程 B 访问人 B。人 A 和人 B 都指向同一个家庭 F。问题是负责实例化公共家庭的 getFamily 逻辑对象由 eclipselink 持久编织代码实现。这不是我们可以控制的。我们会采纳您的建议进行预取,谢谢。
    猜你喜欢
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 2012-11-01
    • 2015-03-08
    • 2016-11-07
    • 1970-01-01
    相关资源
    最近更新 更多