虽然我已经阅读了这里发布的几篇文章和问题,但我仍然无法弄清criteria.setMaxResults()
实际如何运作以及为什么它没有解决我的问题。
我使用的数据库是Oracle10g。下面的代码用于延迟加载分页,每页需要获取15行,因此pageSize = 15
和index
取决于您所在的页面。对于第一页,它是0
。表中的总行数为60k。
public List<FormObject> fetchFormByParams(FormObjectParameters parameters, int pageSize, int index) {
Session session = getCurrentSession();
Criteria criteria = criteriaFromParameters(false, parameters, session);
if (pageSize > 0) {
criteria.setMaxResults(pageSize);
criteria.setFirstResult(index);
} else {
criteria.setMaxResults(Integer.MAX_VALUE);
criteria.setFirstResult(0);
}
List<FormObject> result = (List<FormObject>) criteria.list(); //line 163
return result;
}
执行第163行时,应用程序返回15行需要30-45秒,有时会抛出OutOfMemoryError
。此外,当DB中的数据较少(少于100)时,应用程序会在几秒钟内返回15行。如果我使用延迟加载和setMaxResults()
,请不要知道为什么会发生这种情况。
我也尝试使用setFetchSize()
,但这对我没用,它返回了DB中的所有行,因为它没有使用ROWNUM
。也许它与我使用的驱动程序有关,但不幸的是我不允许更改它。