Приведенные ниже функции кода, но Hibernate никогда не отпускает свой захват какого-либо объекта. Вызов session.clear()
вызывает исключения, связанные с получением связанного класса, а вызов session.evict(currentObject)
до извлечения следующего объекта также не освобождает память. В конце концов я исчерпываю пространство кучи.Спящий режим: Пройдите миллионы строк и не просачивайте память
Проверка моих кучи кучи, StatefulPersistenceContext - это корень сборщика мусора для всех ссылок, указывающих на мои объекты.
public class CriteriaReportSource implements JRDataSource {
private ScrollableResults sr;
private Object currentObject;
private Criteria c;
private static final int scrollSize = 10;
private int offset = 1;
public CriteriaReportSource(Criteria c) {
this.c = c;
advanceScroll();
}
private void advanceScroll() {
// ((Session) Main.em.getDelegate()).clear();
this.sr = c.setFirstResult(offset)
.setMaxResults(scrollSize)
.scroll(ScrollMode.FORWARD_ONLY);
offset += scrollSize;
}
public boolean next() {
if (sr.next()) {
currentObject = sr.get(0);
if (sr.isLast()) {
advanceScroll();
}
return true;
}
return false;
}
public Object getFieldValue(JRField jrf) throws JRException {
Object retVal = null;
if(currentObject == null) { return null; }
try {
retVal = PropertyUtils.getProperty(currentObject, jrf.getName());
} catch (Exception ex) {
Logger.getLogger(CriteriaReportSource.class.getName()).log(Level.SEVERE, null, ex);
}
return retVal;
}
}
Я видел примеры этого в [Hibernate reference] (http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html#batch-update), однако, там 'session.flush()' вызывается до 'session.clear()'. Не могли бы вы попробовать, имеет ли это значение? –
Что это за база данных? Не все поддерживают истинную прокрутку курсора. Кроме того, я не вижу, чтобы вы закрывали ScrollableResults. –
Я использую MySQL. –