每当我们执行查询时,Hibernate / JPA会加载内存中的所有数据吗?它是单独进行某种优化还是有某种机制来批量获取查询数据?
所以我只关心的是,如果我有一个包含数百万行的表,hibernate如何管理这些行,如果我没有指定任何优化策略,是否会立即将所有行加载到内存中?
我使用Oracle作为数据库。
答案 0 :(得分:1)
如果使用interp1d
,Hibernate会将所有映射对象加载到内存中。您可以使用org.hibernate.Query.list
来避免这种情况。然后,您可以滚动浏览org.hibernate.Query.scroll
并在完成会话后逐出会话中的实体。
这样做可以避免将所有实体加载到内存中,从而避免在检查非常大的会话时出现问题。
答案 1 :(得分:0)
每当我们执行查询时,hibernate / jpa是否会加载内存中的所有数据?
不,它就像您手动查询数据库一样。它只在内存中加载该查询的结果集。
它是单独进行某种优化还是有某种机制来批量获取查询数据?
所以这里我只关心的是,如果我有一个包含数百万行的表,如果我使用JPQL或HQL获取它们,hibernate如何管理这些行?
Hibernate在其等效的SQL查询中转换JPQL或HQL。
所以如果你有像
这样的JPQLSELECT 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只将那个行加载到内存中并将其映射到一个对象中。
*我说可能是因为您的实体中可能有嵌入式和连接等复杂的映射 - 当然,这可能需要多个数据库表来重建您的实例子>