首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用延迟负载的最佳方法

使用延迟负载的最佳方法
EN

Stack Overflow用户
提问于 2014-01-31 17:20:48
回答 1查看 1K关注 0票数 0

我有一条很长的链子,所有的东西都会懒洋洋地装上。我们使用JPA(在取模式上运气不好)

在一些情况下,我们不必加载完整的对象图,在这些情况下,性能是好的。但在其他情况下,我们可能需要加载一个完整的对象图,如下所示。

类下面的只用于表示

代码语言:javascript
运行
复制
FirstObject.java

@Lazy
private Set<SecondObject>

代码语言:javascript
运行
复制
SecondObject.java    
@Lazy
private Set<ThirdObject> // may load 20-30 objects
@Lazy
private Set<FourthObject> // may load 20-30 objects

代码语言:javascript
运行
复制
ThirdObject.java
@Lazy
private Set<FourthObject> // may load 10 - 100 records

代码语言:javascript
运行
复制
FourthObject.java
@Lazy
private Set<FifthObject> // may load 10-100 records

(名单还在继续)

边缘案例

如果你看到,每个孩子装载了几个孩子,没有办法避免。想象一下,用户现在正在尝试加载Firstobject.java,他需要完整的对象图直到FifthObject.java图。

代码语言:javascript
运行
复制
firstObject = session.get(FirstObject.class, 10);

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

代码语言:javascript
运行
复制
firstObject.getSecondObject().size() // size() for load all the lazy children

//现在,每个子集合都是一个集合,它们都很懒,因此他必须执行以下操作

代码语言:javascript
运行
复制
for(SecondObject sec: firstObject.getSecondObject()){
    sec.getThirdObject().size();
   //because third object needs fourth object we loop third and get all ffourth
}

所有上述代码大约需要7-10秒才能运行,如果子程序运行时间更长,则可能会更多。

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

我考虑过使用自定义JPQL/本机SQL连接所有相关的子元素,并将实体对象作为一个选项返回,但我想知道所有的努力是否都是好的。

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

EN

回答 1

Stack Overflow用户

发布于 2014-01-31 18:05:47

我考虑过使用自定义JPQL/本机SQL连接所有相关的子元素,并将实体对象作为一个选项返回,但我想知道所有的努力是否都是好的。

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

此外,考虑预计算结果,如果它们是昂贵的去做,以改善时间响应。例如,如果计算某些总数很昂贵,则在DB中的其他地方保留一个总数,并在每个插入/删除项上增加/减少总数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21486177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档