Hallo!
Ich möchte folgendes Batch-Pattern mit Hibernate umsetzen und wüsste gerne wie, weil ich nicht zurecht komme.
- Es solle eine grosse Menge von Objekten via HQL aus der Datenbank gelesen werden
- über diese Menge soll iteriert werden, jedes Objekt wird verändert/ergänzt und wieder gespeichert
Da es sich um eine grosse Menge von Objekten handelt, die viel Platz im Speicher einnehmen, möchte ich die Objekte via ScrollableResults einlesen.
Dieses Pattern brauchen wir immer wieder, funktioniert alles, kein Problem.
Nun möchte ich den Batch so erweitern, dass im Zuge der Bearbeitung der einzelnen Objekte nicht nur wie bisher die Session geflushed/gecleared wird,
sondern auch noch COMMITed wird. Da das einlesende HQL dies berücksichtigt, kann der Batch ohne weiteres durch Neustart wieder aufgesetzt werden,
anstatt wieder von vorne anzufangen.
Nun beginnen die Probleme:
- ScrollableResults ist ein Cursor, der sich derzeit innerhalb derselben Transaktion befindet. Durch Commit wird die Transaktion geschlossen und ScrollableResults.next funktioniert nicht mehr.
- Daher glaube ich, dass beide in zwei unterschiedlichen Transaktionen parallel laufen sollten. Kann ich dies in derselben Session machen (wie?)oder habe ich damit zwei unterschiedliche Sessions?
- Wenn ich zwei Sessions haben, muss ich das mit ScrollableResults gelesene Objekt von einer Session in die andere übergeben. Wie mache ich das, ohne das ein Statement gegen die DB abgesetzt wird?
Kann mir jemand erklären, wie das Hibernate-typische Vorgehen hier aussieht? Bzgl. dieser Batch-Pattern finde ich nicht viel im Internet.
Paging mit setFirstResult/setMaxResults möchte ich nicht verwenden.
Danke schön, CL