Использование setMaxResults() не решило OutOfMemoryError при получении данных
Хотя я прочитал несколько статей и вопросов, опубликованных здесь, я все еще не могу понять, как criteria.setMaxResults()
на самом деле работает и почему это не решило мою проблему.
База данных, которую я использую - Oracle10g. Приведенный ниже код используется для медленной загрузки страниц, и ему нужно выбрать 15 строк на страницу, поэтому pageSize = 15
а также index
зависит от того, на какой странице вы находитесь. Для первой страницы это 0
, Общее количество строк в таблице составляет 60 тыс.
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 выполняется, требуется 30-45 секунд, пока приложение не вернет 15 строк, а иногда выдает OutOfMemoryError
, Кроме того, когда данных в БД было меньше (менее 100), приложение возвращает 15 строк за пару секунд. Не знаю, почему это происходит, если я использую ленивую нагрузку и setMaxResults()
,
Я тоже пробовал с setFetchSize()
но это не сработало для меня, и он вернул все строки из БД, так как он не использовал ROWNUM
, Возможно, что-то связано с драйвером, который я использую, но, к сожалению, мне не разрешено его менять.