Re: Kniffliges Hibernate-Session-Problem.



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
.



Relevant Pages

  • Re: Umgebungsvariablen mittels Shellskript setzen
    ... > dem script, dass die Session startet. ... > bei der jeweiligen Systemkonfiguration zu Beginn der X-Session durch- ... Next by Date: ... Previous by thread: ...
    (de.comp.os.unix.linux.misc)
  • Re: Sprache zur Laufzeit wechseln
    ... Oder wird das durch Thread... ... Nein, damit wird nur der aktuelle Benutzer umgeschaltet und das auch nur, solange die Anwendung auf dem Server läuft, bis eine Seite ausgegeben wird. ... Diese Einstellung gilt nur für den CurrentThread, nicht für die Session, in der der Benutzer arbeitet. ...
    (microsoft.public.de.german.entwickler.dotnet.asp)
  • Re: Kniffliges Hibernate-Session-Problem.
    ... Ich habe einen Webservice der Anfragen auf ... Nun habe ich Hibernate gesagt, es soll die childNodes lazy laden, ... session or session was closed" ... gute Idee ist, mehrere Threads Lazy-Loading machen zu lassen, da man da ...
    (de.comp.lang.java)
  • Kniffliges Hibernate-Session-Problem.
    ... Ich habe einen Webservice der Anfragen auf ... über Lazy-Loading weitere Knoten nachladen sollen. ... session or session was closed" ... gute Idee ist, mehrere Threads Lazy-Loading machen zu lassen, da man da ...
    (de.comp.lang.java)
  • Re: Datumsformat benutzerabhängig? aber nur client-seitig
    ... werden eventuell auch mit der vom Client verlangten Sprache gemacht. ... sollte deshalb nur die UI Culture geaendert ... > Nein, eine Session kann, und wird in der Regel aus mehreren Requests ... > CurrentThread.CurrentCulture setzt, dann gilt das nur für diesen Thread. ...
    (microsoft.public.de.german.entwickler.dotnet.asp)