Performance Do query加载内存中的所有数据

Performance Do query加载内存中的所有数据,performance,hibernate,jpa,Performance,Hibernate,Jpa,无论何时执行查询,Hibernate/JPA都会加载内存中的所有数据吗?它是自己进行某种优化,还是有某种机制可以批量获取查询数据 所以这里我关心的是,如果我有一个有数百万行的表,hibernate是如何管理这些行的,如果我没有指定任何优化策略,所有的行会一次加载到内存中吗 我使用Oracle作为数据库 每当执行查询时,hibernate/jpa是否会加载内存中的所有数据 不,它会像手动一样查询数据库。它只在内存中加载该查询的结果集 它是自己进行某种优化,还是有某种机制批量获取查询数据 所以这里我

无论何时执行查询,Hibernate/JPA都会加载内存中的所有数据吗?它是自己进行某种优化,还是有某种机制可以批量获取查询数据

所以这里我关心的是,如果我有一个有数百万行的表,hibernate是如何管理这些行的,如果我没有指定任何优化策略,所有的行会一次加载到内存中吗

我使用Oracle作为数据库

每当执行查询时,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
选择P.id、P.name、P.address、P.FROM TB_Person P其中P.id=99
因此,如果
TB_Person
表有数百万行,则只应获取一行(可能是*)。然后Hibernate将只将该行加载到内存中,并将其映射到对象中


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

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


这样做将避免将所有实体加载到内存中,并避免脏检查非常大的会话的问题。

如果我从Person p编写一个类似
的查询,并且Person表中有数百万行,那么所有这些行是否会立即被提取到内存中?是的,它们会。来自Person p
JPQL的
被转换为
SELECT p.from TB_Person p
,从而将该表在数据库中的所有内容(在您的例子中是Oracle)都带到了数据库中。