java - JPA Hibernate fetchSize 查询提示问题

标签 java oracle hibernate jpa

我一直在使用 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/

相关文章:

sql - 查找按订单聚合的最大日期 - Oracle SQL

java - Hibernate 自增属性

java - onSave()(对于使用 Hibernate/Spring Data Repositories 保存的任何实体)

java - 如何修复 Android java 中的 "each bind variable in the query must have a matching method parameter"错误?

java - 从 Java 程序打开浏览器窗口

python - 通过 pyodbc 更新 Oracle DB 挂起

oracle - 手动运行计划的作业。 LAST_RUN_DATE 未更新

java - 如何使用 CloudFoundry.com 在云中运行 Java SE 应用程序?

java - 显示链表的第一个节点

java - 警告[CommonsLogger.java :60] ognl. MethodFailedException : Method failed for object [java. lang.NoSuchMethodException :([Ljava. lang.String;)]