【问题标题】:JPA: how to avoid timeout issue for EAGER fetchingJPA:如何避免 EAGER 获取的超时问题
【发布时间】:2016-03-09 16:42:40
【问题描述】:

我在 JPA 遇到了一种情况。

我有一个实体,比如 A.A 和自己有父子关系。所以 A 可以有一个 A(children) 和一个 A(parent) 的集合。如果 parent 为 null,则表示 A 是层次结构。

我的用例是,我需要获取表中的所有数据(可以是大约 30k-40k 行),然后根据实体之间的父子关系将其组织成树结构。

所以我决定让 Collection 字段的 EAGER 获取,因此 JPA 将自己获取所需树结构中的数据,并且它工作得非常好。 但在其他用例中,不需要获取 A 的全部数据,并且当数据过多时也会导致超时问题。 那么我该如何解决这个问题呢?

我计划将两个实体映射到表中,一个具有 EAGER 策略,另一个具有 LAZY 策略。所以我会在我的用例中使用 EAGER 一种,而其他用例将使用 LAZY 一种。 这会是一个干净的解决方案吗?

【问题讨论】:

    标签: jpa fetch openjpa


    【解决方案1】:

    不,我不这么认为。出于任何原因,我从未尝试将两个单独的实体附加到同一张表上,这感觉是个有问题的想法。相反,我建议您考虑设置查询超时,这似乎是个坏主意,因为您将获得大量您说不需要的数据,而且显然您的性能会很差。

    或者,可能是最好的解决方案,在它并不总是需要的地方停止急切获取,我想你在实体 A 中说过。由于 A 本质上是树结构中的一个节点,所以把 Fetch=EAGER 总是会获取整棵树,正如您所说,它可能非常大。大到足以在某些情况下引起问题。我建议删除 EAGER 提取,构建一些命名查询,并管理您通过服务层提取的内容。这不是很难,过去对我来说效果很好。

    【讨论】:

    • 我删除了 EAGER 提取。现在我在运行时使用 FETCH MODE 激活 EAGER fetch。到目前为止,它似乎工作正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多