Der folgende Code funktioniert, aber Hibernate lässt nie seinen Griff von einem Objekt los. Das Aufrufen von session.clear()
verursacht Ausnahmen in Bezug auf das Abrufen einer verknüpften Klasse und das Aufrufen von session.evict(currentObject)
vor dem Abrufen des nächsten Objekts kann den Speicher ebenfalls nicht freigeben. Irgendwann erschöpfe ich meinen Haufen Platz.Hibernate: Gehen Sie Millionen von Zeilen und keinen Speicherverlust
Beim Überprüfen meiner Heap-Dumps ist StatefulPersistenceContext das Stammverzeichnis des Garbage Collectors für alle Referenzen, die auf meine Objekte verweisen.
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;
}
}
Ich habe Beispiele in der [Hibernate-Referenz] (http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html#batch-update) gesehen, jedoch dort 'session.flush()' wurde vor 'session.clear()' aufgerufen. Könnten Sie versuchen, ob es einen Unterschied macht? –
Welche Datenbank ist das? Nicht alle unterstützen echtes Cursor-Scrollen. Außerdem sehe ich nicht, dass Sie die ScrollableResults schließen. –
Ich habe MySQL verwendet. –