查询加载内存中的所有数据

时间:2015-10-08 14:51:19

标签: performance hibernate jpa

每当我们执行查询时,Hibernate / JPA会加载内存中的所有数据吗?它是单独进行某种优化还是有某种机制来批量获取查询数据?

所以我只关心的是,如果我有一个包含数百万行的表,hibernate如何管理这些行,如果我没有指定任何优化策略,是否会立即将所有行加载到内存中?

我使用Oracle作为数据库。

2 个答案:

答案 0 :(得分:1)

如果使用interp1d,Hibernate会将所有映射对象加载到内存中。您可以使用org.hibernate.Query.list来避免这种情况。然后,您可以滚动浏览org.hibernate.Query.scroll并在完成会话后逐出会话中的实体。

这样做可以避免将所有实体加载到内存中,从而避免在检查非常大的会话时出现问题。

答案 1 :(得分:0)

  

每当我们执行查询时,hibernate / jpa是否会加载内存中的所有数据?

不,它就像您手动查询数据库一样。它只在内存中加载该查询的结果集。

  

它是单独进行某种优化还是有某种机制来批量获取查询数据?

     

所以这里我只关心的是,如果我有一个包含数百万行的表,如果我使用JPQL或HQL获取它们,hibernate如何管理这些行?

Hibernate在其等效的SQL查询中转换JPQL或HQL。

所以如果你有像

这样的JPQL
SELECT p FROM Person WHERE p.id = 99

Hibernate会将其转换为(可能是*)类似

的内容
SELECT P.id, P.name, P.address, P.<other-mapped-fields> FROM TB_Person P WHERE P.id = 99

因此,如果TB_Person表有数百万行,则只应提取一行(可能是*)。然后Hibernate只将那个行加载到内存中并将其映射到一个对象中。

*我说可能是因为您的实体中可能有嵌入式和连接等复杂的映射 - 当然,这可能需要多个数据库表来重建您的实例