Frage

Ich habe NHibernate Sitzungen in der ASP.NET-Sitzung im Cache gespeichert.

Ich kam in einer Situation, wo ein Benutzer ein Objekt bearbeitet, so dass es in der ISession in ihrem ersten Level-Cache ist. Ein anderer Benutzer dann das gleiche Objekt bearbeitet werden.

An diesem Punkt User1 sieht immer noch ihre ursprüngliche Version ihrer Bearbeitungen, wo als User2 den korrekten Zustand des Objekts sieht?

Was ist der richtige Weg, dies zu handhaben, ohne session.Refresh (myObj) manuell aufrufen explizit für jedes einzelne Objekt die ganze Zeit?

Ich habe auch einen zweiter Level-Cache aktiviert. Für NHibernate Lange Session soll ich deaktivieren nur die ersten Level-Cache vollständig?

Edit: Hinzufügen mehr Terminologie zu dem, was ich bin auf der Suche von 10.4.1. Lange Sitzung mit automatischer Versionierung Ende dieses Abschnitts schließt mit

Wie die ISession ist auch der (obligatorische) erste Level-Cache und enthält alle geladenen Objekte, können wir propably diese Strategie nur für ein paar Request / Response-Zyklen verwenden. Dies ist in der Tat zu empfehlen, da die ISession bald auch veraltete Daten hat.

Ich bin nicht sicher, welche Art von Dokumentation ist dies für sie beide wahrscheinlich zu schließen und dann sofort sagen, dass die Sitzung veraltete Daten hat (das ist, was ich sehe). Was ist die Lösung für dieses hier, oder gibt es keine?

War es hilfreich?

Lösung 3

Offensichtlich ist dies ein bekanntes Manko von NHibernate wie durch Dokumentation ausführlich in meiner Frage zitiert.

Andere Tipps

Verwenden Sie einfach IStatelessSession statt ISession.

Beachten Sie auch, dass NH nicht mit langlebigem ISessions verwendet werden wurde entwickelt (wie bereits von anderen erwähnt). Ein Problem ist, dass Sie bereits erwähnt. Die andere ist, dass die Leistung deutlich sinkt, wenn es eine große Objektgraph von NH verfolgt. Beide Probleme könnten vermieden werden, durch IStatelesSession verwenden. Es gibt Sie Objekte freistehend nicht von NH verfolgt wird.

Nicht sicher über die Gründe für Sitzungen in der ASP.NET-Sitzung zu halten. Vielleicht könnten Sie ein paar Details zur Verfügung stellen?

Denken Sie auch daran, dass eine Sitzung ist ein Wrapper über IDbConnection. leicht führen zu conneciton Pool Hunger hält es offen ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top