gpt4 book ai didi

java - Hibernate ScrollableResults 不返回整组结果

转载 作者:行者123 更新时间:2023-11-30 11:59:27 25 4
gpt4 key购买 nike

我们运行的一些查询有 100'000 多个结果,加载它们然后将它们发送给客户端需要很长时间。所以我使用 ScrollableResults 来获得分页结果功能。但我们在大约 50,000 个结果时达到了顶峰(从来没有完全相同数量的结果)。

我在 Oracle9i 数据库上,使用 Oracle 10 驱动程序,Hibernate 配置为使用 Oracle9 方言。我尝试使用最新的 JDBC 驱动程序 (ojdbc6.jar),问题重现。

我们还关注了一些advice并添加了一个排序子句,但问题重现。

这是一个代码片段,说明了我们所做的事情:

final int pageSize = 50;
Criteria crit = sess.createCriteria(ABC.class);
crit.add(Restrictions.eq("property", value));
crit.setFetchSize(pageSize);
crit.addOrder(Order.asc("property"));
ScrollableResults sr = crit.scroll();
...
...
ArrayList page = new ArrayList(pageSize);
do{
for (Object entry : page)
sess.evict(entry); //to avoid having our memory just explode out of proportion
page.clear();
for (int i =0 ; i < pageSize && ! metLastRow; i++){
if (sr.next())
page.add(sr.get(0));
else
metLastRow = true;
}
metLastRow = metLastRow?metLastRow:sr.isLast();

sendToClient(page);
}while(!metLastRow);

那么,为什么我得到的结果集在最后告诉我它应该有这么多结果?

最佳答案

您的代码片段缺少重要的部分,例如 resultSetpage 的定义。但无论如何我想知道,这条线不应该

if (resultSet.next())

宁愿

if (sr.next())

?

附带说明一下,AFAIK 从持久化上下文中清除多余的对象可以简单地通过调用

session.flush();
session.clear();

而不是遍历对象集合来分别逐出每个对象。 (当然,这需要查询在自己的独立 session 中执行。)

更新:好的,下一轮猜测:-)

您真的可以检查哪些行被发送到客户端并将其与直接针对数据库的等效 SQL 查询的结果进行比较吗?最好知道此代码是检索(并向客户端发送所有行达到一定限制,还是仅从整个结果集中检索某些行(如每 2 行),或者......这可以阐明根原因。

你可以尝试的另一件事是

crit.setFirstResults(0).setMaxResults(200000);

关于java - Hibernate ScrollableResults 不返回整组结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2577681/

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