- 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/
我必须将可滚动结果引用转换为列表引用。是否可以?当我尝试转换时,我收到异常 java.lang.ClassCastException: org.hibernate.impl.ScrollableRes
我在 MySQL 数据库的表用户中有 7500 行,VM 选项:-Xmx8m 和下面的一些代码: Query query = session.createQuery("select u from Us
我们运行的一些查询有 100'000 多个结果,加载它们然后将它们发送给客户端需要很长时间。所以我使用 ScrollableResults 来获得分页结果功能。但我们在大约 50,000 个结果时达到
我正在尝试提取与某些谓词匹配的 count(*) 。每次我使用 createSQLQuery 时,我发现自己必须按照以下方式编写代码: // skipped code Query q = sessio
这是我第一次尝试这个,但我收到以下错误: The result set is closed 尝试使用ScrollableResults时。 @Override public void associar
我执行一个返回实体列表的查询。如何从 ScrollableResults 中检索实体: Session s = ....; Query q = s.createQuery("....") # r
我正在尝试使用 Hibernate 从表中检索大约 1 亿行。我有一个持久实体项目,其中包含内部的费用集合(另一个持久实体)。鉴于我将遍历结果并访问每个对象的费用,我想急切地获取费用以避免 n+1 问
我使用 ORM 框架已有一段时间了,但我对 Hibernate 还是比较陌生。 假设您有一个查询(它是一个查询还是一个条件,无关紧要)检索了一个很好的结果集并且您想要对其进行分页。您更愿意使用 set
使用 JPA/Hibernate 的简单 Java 批量读取数百万行。我的问题是:如何使用 ScrollMode.FORWARD_ONLY 识别 ScrollableResults 中的最后结果? 使
我只需要使用 Hibernate 读取 MySQL 数据库中表中的每一行并基于它编写一个文件。但是有 9000 万行,而且非常大。因此,以下内容似乎是合适的: ScrollableResults re
重要提示:这已被接受为 Spring issue目标修复版本为 4.1.2。 我的目标是在从 Hibernate 的 ScrollableResults 生成 HTTP 响应时实现 O(1) 空间复杂
我是一名优秀的程序员,十分优秀!