gpt4 book ai didi

java - 使用延迟加载的最佳方法

转载 作者:行者123 更新时间:2023-12-01 13:32:27 25 4
gpt4 key购买 nike

我有一个很长的对象链,所有这些对象都将被延迟加载。我们使用 JPA(在 fetchmodes 上运气不好)

在少数情况下,我们不必加载完整的对象图,在这些情况下性能很好。但在其他少数情况下,我们可能必须加载完整的对象图,如下所示。

以下类(class)仅供引用

FirstObject.java

@Lazy
private Set<SecondObject>
<小时/>
SecondObject.java    
@Lazy
private Set<ThirdObject> // may load 20-30 objects
@Lazy
private Set<FourthObject> // may load 20-30 objects
<小时/>
ThirdObject.java
@Lazy
private Set<FourthObject> // may load 10 - 100 records
<小时/>
FourthObject.java
@Lazy
private Set<FifthObject> // may load 10-100 records

.
.
.
(这样的例子还在继续)

边缘情况

如果你看到,每个子进程加载多个子进程,这是没有办法避免的。想象一下,用户现在正在尝试加载 Firstobject.java,并且他需要完整的对象图,直到 FifthObject.java 图。

firstObject = session.get(FirstObject.class, 10);

//因为所有的 child 都很懒,他尝试像下面这样初始化它们。

firstObject.getSecondObject().size() // size() for load all the lazy children

//现在每个 child 都是一个集合,他们很懒,所以他必须执行以下操作

for(SecondObject sec: firstObject.getSecondObject()){
sec.getThirdObject().size();
//because third object needs fourth object we loop third and get all ffourth
}

以上所有代码的运行时间大约为 7-10 秒,如果 child 较多,运行时间可能会更长。

问题是,在这种情况下如何加载对象?用户交互非常不稳定,我们可能需要也可能不需要完整的图表。

我考虑过使用自定义 JPQL/ native SQL 来连接所有相关的子级并返回 Entity 对象作为一个选项,但想知道所有的努力是否都很好。

注意:用户可能不需要对象图中返回的所有信息,但是,他只需要几个属性用于显示目的(但他需要所有对象)。

最佳答案

I've thought about using custom JPQL/native SQL which joins all the related children and return Entity objects as one option, but wondering if all the effort is good.

我认为这对您来说是一个不错的选择。您必须以某种方式在数据库中汇总这些信息,并最大限度地减少应用程序中的对象创建。将所有这些对象放入主内存只是为了执行一些计算是一个坏主意。

此外,如果预先计算结果的成本很高,请考虑预先计算结果,以提高时间响应。例如,如果计算某个总计的成本很高,请将总计保留在数据库中的其他位置,并在每个插入/删除的项目上增加/减少它。

关于java - 使用延迟加载的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21486177/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com