代码之家  ›  专栏  ›  技术社区  ›  Robert Kovačević

jpa延迟加载性能的好处有多大?

  •  3
  • Robert Kovačević  · 技术社区  · 15 年前

    我知道这是非常具体的具体应用,但我只是想知道什么是一般的意见,或至少一些个人经验的问题。

    我不喜欢“视图中的开放会话”模式,因此为了避免这种情况,我考虑的是简单地急切地获取所有小的内容,并使用服务层中的查询来获取更大的内容。

    有人用过这个后悔吗?对于视图层中的延迟加载,是否有一些我不知道的优雅解决方案?

    2 回复  |  直到 14 年前
        1
  •  5
  •   BalusC    15 年前

    如果您根本不打算使用相关数据(例如,只显示一个客户列表,因此忽略嵌套的订单集),或者还不确定用户是否希望查看相关数据(例如,mem中有一个客户列表),那么延迟加载才是有益的。ORY和订单列表请求取决于将来的操作)。

    如果您确定一次显示所有数据,那么不需要延迟加载,只需要额外的查询。

        2
  •  3
  •   Brian Teeter    14 年前

    如果您有一个设计良好的模式和实体,并且这些模式和实体广泛地映射到应用程序中的其他实体,则基本上需要延迟加载。下面是一个非常基本的例子:

    实体映射一对多 转介

    转介 一对一 两次(推荐人和被推荐人)

    很简单,对吧?好吧,如果在这两种关系中使用紧急加载,可能会导致大量后续查询,这些查询可能在大多数情况下都不会显示。

    例如:

    你的应用程序要加载记录“ 人物角色 “还有这个 人物角色 有3个转介记录,因为他转介了3个客户: 人物角色 , 小精灵 人品 .

    因此,如果您渴望获取这种关系,jpa将加载这3个人的记录。让我们说 人物角色 介绍了10位顾客,因为他喜欢你卖的东西。现在jpa也不得不加载这10个客户,同样是因为急于加载。

    你可以看到这是怎么回事。如果这是一个延迟加载的关系,那么只有在直接对其执行getreferrals()调用时才会加载这组额外的数据。

    就我个人而言,我将避免创建其他方法来执行这些抓取。编写代码需要做很多额外的工作,现在您需要以某种方式管理实体的状态,以及是否需要进行额外的加载。

    如果使用延迟加载,jpa会使这一点变得简单。只需做任何get…)调用您通常对实体pojo和jpa执行的操作。