Hallo,
ich verwende NHibernate 3.0 als O/R-Mapper.
Auf meiner WebSite bekommt jeder Benutzer sein eigenes ISession-Objekt (NHibernate Verbindung zur Datenbank), welches in einer ASP.NET Session gespeichert wird.
Jetzt habe ich aber auch noch einen WebService, der auch auf die Datenbank zugreifen muss.
Zum Testen habe ich erstmal das ISession-Objekt in einem Singleton verkleidet.
Wenn aber nun viele Anfragen gleichzeitig kommen, fliegen willkürliche NHibernate Fehler (z.B. DataReader already open, usw.)
Nun meine Frage, ob ich auch im WebService auf die HttpSession des aufrufenden Benutzers zugreifen kann um sich so, wie im Web, die ISession separat zu halten?
Vielleicht gibt es auch Dinge zu beachten?
Schönen Dank schonmal im Voraus.
Achtung! - Hinter dir ist ein dreiköpfiger Affe!
Hallo
Also was mir so dazu einfällt:
"DataReader already open"
klingt nach einer sql abfrage direkt nach einer anderen ohne das der reader zuvor geschlossen wurde
Im Webservice kannst du auf die Session zugreifen in dem du das Attribut und
den Wert setzt >
[WebMethod(EnableSession = true)]
public void TheFunctionName()
{
}
hoffe das es dir ein wenig weiter hilft
grüße
Hallo,
Vielleicht gibt es auch Dinge zu beachten? Zu beachten wäre, daß Website und Webservice zur selben Applikation gehören, damit die Session gefunden wird. Da Du aber mit einem Singleton arbeiten kannst, dürfte das ja der Fall sein.
Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
huhu,
ich kenne jetzt NHibernate nicht, aber "Web" "Session" und "Singleton" lässt mir die Haare zu Berge stehen. Bitte nicht ein Session-Object per Singleton zur Verfügung stellen. Das gibt ganz böses Verhalten, da man im Web immer mit Multithreading rechnen sollte. Wäre ja doof, wenn durch ein Singleton das Session-Objekt zwischen den Benutzern geteilt wird (und seien es nur die rechte für die Datenbank :evil: ).
ich hoffe ich habe es falsch verstanden 🙂
🙂
Xynratron
Herr, schmeiss Hirn vom Himmel - Autsch!
Die Erfahrung zeigt immer wieder, dass viele Probleme sich in Luft auslösen, wenn man sich den nötigen Abstand bzw. Schlaf gönnt.
Hallo Xynratron,
ich hoffe ich habe es falsch verstanden 😃
Ich hatte es jedenfalls so verstanden daß eine sessionbasierte Lösung gesucht wird um den Singleton entsorgen zu können 😃
Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
eine sessionbasierte Lösung gesucht wird um den Singleton entsorgen zu können 😃
hoffen wir mal 😃
dann wäre aber [WebMethod(EnableSession = true)] aus dem ersten Post korrekt (Nochmalige Erwähnung, damit es nicht überlesen wird).
Liebe Grüße
Xynratron
Herr, schmeiss Hirn vom Himmel - Autsch!
Die Erfahrung zeigt immer wieder, dass viele Probleme sich in Luft auslösen, wenn man sich den nötigen Abstand bzw. Schlaf gönnt.
Guten Morgen und danke für die vielen Antworten!
momentan ist es so, dass nicht die HttpSession (das wäre böse) sondern die Hibernate-Session (nicht weniger böse) als Singleton gehalten wird, was bei hohem Traffic natürlich Probleme verursacht (habe ich gestern abend noch nachgestellt).
Die Hibernate-Session für jeden Benutzer in der HttpSession zu halten funktioniert und es werden keine Exceptions mehr geschmissen auch bei 100 ausführenden Threads gleichzeitig.
Ich werde jetzt noch ein paar Szenarien durchspielen, aber ich vermute, dass nun alles passt.
Vielen Dank für eure Hilfe 🙂
Achtung! - Hinter dir ist ein dreiköpfiger Affe!