作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们运行的一些查询有 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);
那么,为什么我得到的结果集在最后告诉我它应该有这么多结果?
最佳答案
您的代码片段缺少重要的部分,例如 resultSet
和 page
的定义。但无论如何我想知道,这条线不应该
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/
我是一名优秀的程序员,十分优秀!