【问题标题】:Unloading JPA references卸载 JPA 引用
【发布时间】:2012-08-27 15:52:05
【问题描述】:

jpa 2.0 是否有某种“相反”来引用延迟加载注释?即向 jpa 提示的注释,如果带注释的引用是对该对象的唯一剩余引用,则如果内存不足,则目标对象有资格进行垃圾收集。

如果访问先前加载的引用,我会完全满足于支付性能损失,因为它已被换出,导致后续加载相同的引用。我需要这样的行为,因为我的域太大而无法保存在内存中。我一直在寻找这个,但一直空手而归,这让我想知道我是否错误地解决了这个问题。

【问题讨论】:

    标签: java jpa jpa-2.0 eclipselink


    【解决方案1】:

    jpa 2.0 是否有某种“相反”来引用延迟加载注释?

    Lazy 的反义词是Eager,很遗憾这可能不是您想要的,因为这些是“获取方法”。

    即向 jpa 提示的注释,如果带注释的引用是对该对象的唯一剩余引用,则如果内存不足,则目标对象有资格进行垃圾回收。

    不,没有这样的注释。这种行为听起来像是你不想要的。这可以在NullPointerExceptions、IndexOutOfBoundExceptions、LazyInitializationExceptions 等中解决。一个对象只有在对象没有引用它时才有资格进行垃圾回收。 (这不是 g.c. 的完整解释,但这是基本规则。)

    如果访问先前加载的引用,我会完全满足于支付性能损失,因为它已被换出,导致后续加载相同的引用。我需要这样的行为,因为我的域太大而无法保存在内存中。我一直在寻找这个,但一直空手而归,这让我怀疑我是否解决了错误的问题。

    我认为您以错误的方式处理问题。我对你的申请一无所知,所以很难说你能做什么。如果不再需要某个对象(通过您的方式),那么您需要处理它。 JPA 不会自动为您执行此操作。

    【讨论】:

    • 感谢您的回答!我现在意识到我应该更具体地回答我的问题。我的域模型是一个太大而无法保存在内存中的无向图。我的客户端逻辑遍历图,在遇到节点时对其进行处理。处理完一个节点后,客户端逻辑将按照其中一个链接到相邻节点继续进行。给定足够的时间,遍历算法将重新处理先前处理的节点。由于内存,我需要卸载已处理的节点,但在某些时候将再次需要卸载的节点。使用 JPA 完成此任务的最佳方法是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    相关资源
    最近更新 更多