提问者:小点点

JPA:如何避免 EAGER 获取的超时问题


我在JPA中遇到了一个情况。

我有一个实体,假设A.A与自身有父子关系。因此,A 可以有一个 A(子项)和一个 A(父级)的集合。如果父节点为 null,则表示 A 是层次结构的根节点。

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

所以我决定对集合字段进行快速获取,这样JPA本身就可以在所需的树结构中获取数据,并且工作得非常好。但是在其他用例中,并不需要获取的全部数据,而且当数据太多时会导致超时问题。那么,我该如何解决这个问题呢?

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


共1个答案

匿名用户

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

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