gpt4 book ai didi

java - JPA Hibernate fetchSize 查询提示问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:08:09 28 4
gpt4 key购买 nike

我一直在使用 JPA 2.0 和 hibernate 作为我的 Web 应用程序的供应商。对于其中一个数据库查询,我使用 JPA criteria builder API 来构造动态查询。我已经能够让它按预期工作。

查询在两个表 A 和 B 之间有一个提取连接。A 与 B 有一对多关系。

Join<A,B> ordLeg = ord.joinSet("bLegs", JoinType.INNER);
ord.fetch("bLegs",JoinType.INNER);

我还使用了 setMaxResults 来限制 no。返回给用户的记录数

typedQuery.setMaxResults(10);

仅供引用,数据库中大约有 400 条记录。

当我在日志中看到查询结果时,我看到它加载了内存中的所有 400 条记录。但是,由于设置了 Maxresults,它只向用户返回 20 条记录。

进一步分析,发现hibernate有提示可以批量获取记录,而不是将400条记录全部加载到内存中。

TypedQuery<A> typedQuery = entityManager.createQuery(query);
typedQuery.setHint("org.hibernate.fetchSize", 5);
List<A> orderList = (List<A>) typedQuery.getResultList();

但它似乎根本没有领会这个暗示。我仍然看到它在内存中加载了所有 400 条记录,并且没有完成批量提取。我期待它以 2 批 5 的形式获取 10 (maxResults) 条记录。我错过了什么吗?\

如果指定查询的数据库中有超过 1000 条记录,将会严重影响性能。

我什至尝试在 persistence.xml 级别设置以下属性,但没有成功。

<properties>
<property name="hibernate.jdbc.batch_size" value="5"/>
<property name="hibernate.jdbc.fetch_size" value="5">
</properties>

你能帮我找到正确的方向吗?

Hibernate 版本:我试过 3.6.4.Final、4.0.0.Final 和 4.2.1.Final

感谢您的帮助。

谢谢,桑托斯

最佳答案

由于连接,maxresults 可能无法按预期工作。假设每个用户有 10 个地址,而您期望有 10 个用户,那么 db 查询应该给您 10x10=100 条记录,然后 jpa 必须将用户放在一个对象中,其中包含 10 个地址的列表作为集合。所以你会看到结果集和返回的最终对象之间存在差异。获取大小将告诉 jpa 仅通过 jdbc 调用获取这些记录。获取大小越小,jpa 对 db 的调用次数越多。如果查询不是很重,请尝试增加获取大小,在 400 条记录的情况下,使用一个内部联接,您可以轻松地使用更高的获取大小值。

关于java - JPA Hibernate fetchSize 查询提示问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18325844/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com