Re: Kniffliges Hibernate-Session-Problem.
- From: Sebastian Scheid <mynewsgroup@xxxxxx>
- Date: Tue, 28 Mar 2006 21:05:06 +0200
Jan Thomä schrieb:
Nun habe ich Hibernate gesagt, es soll die childNodes lazy laden,
nämlich genau dann, wenn jemand den Getter aufruft. Dadurch soll
vermieden werden, den ganzen Baum auf einmal in den Speicher zu laden.
Ich lade also am Anfang nur den Wurzelknoten und warte dann auf Anfragen
die ggf. über Lazy-Loading weitere Knoten nachladen sollen. Das Problem
dabei ist nun aber, daß Anfragen auf den Webservice stets einen neuen
Thread aufmachen (was ja auch sinnvoll ist um mehrere Abfragen parallel
verarbeiten zu können). Nun beschwert sich aber Hibernate, wenn es die
Kindknoten nachladen soll darüber, daß für diesen Thread keine Session
existiert (der Knoten quasi detached ist) und er deswegen die Kinder
nicht nachladen kann.
"org.hibernate.LazyInitializationException: failed to lazily initialize
a collection of role: server.registry.HBRegistryNode.children, no
session or session was closed"
Nun habe ich schon überlegt, daß es wahrscheinlich eh keine sonderlich
gute Idee ist, mehrere Threads Lazy-Loading machen zu lassen, da man da
wahrscheinlich merkwürdige Ergebnisse bekommt. Nun brauche ich eine
zündende Idee wie man an diese Sache herangehen könnte (kein Code oder
so, nur eine Idee). Es müßte folgendes erreicht werden:
- Alle Anfragen an die Knotenstruktur laufen im selben thread oder
werden zumindest synchronisiert.
- Das Session-Problem wird behoben.
Du darfst auf eine Session (oder daran attachte Objekte) nur aus einem Thread zugreifen. D.h. du musst das Wurzelelement bei jeder Anfrage neu laden. Dann läufts auch mit dem Lazy-Loading. Also:
- Anfrage
- Session öffnen
- Wurzel holen
- Children abhängig von Anfrage holen (wird lazy gemacht)
- Session schließen
- Ergebnis zurücksenden
Das hat weiterhin den Vorteil, dass du keine alten Daten im Speicher hast. Die Performance sollte hier kein Problem machen, weil du ja eh auf die DB zugreifst und wenn du jedesmal genau ein Element mehr lädst (die Wurzel) sollte das keinen Unterschied machen.
Schöne Grüße
Sebastian
.
- References:
- Kniffliges Hibernate-Session-Problem.
- From: Jan Thomä
- Kniffliges Hibernate-Session-Problem.
- Prev by Date: Re: Wie kann ich eine EventSource identifizieren?
- Next by Date: Daten lokal speichern in XML mit mehreren Benutzern und mittel großen Mengen
- Previous by thread: Re: Kniffliges Hibernate-Session-Problem.
- Next by thread: Symmetrisch definierte Kurven nicht symmetrisch!?
- Index(es):
Relevant Pages
|