4 Stimmen

Schlechte Leistung von NHibernate bei Auto-Flush-Ereignissen?

Zunächst möchte ich sagen, dass ich weiß, dass NH die Verwendung von Massenoperationen nicht empfiehlt. Aber interessehalber habe ich mich gefragt, warum dies so teuer ist. Bei 200 Objekten in meinem System dauert es 4 Minuten, wovon 90+% der Zeit auf DefaultAutoFlushEventListener.OnAutoFlush entfallen (dank RedGate Profiler). Das ist wahnsinnig. Ich frage mich, ob jemand einen benutzerdefinierten DefaultAutoFlushEventListener geschrieben hat, der dieses Hindernis für große, sich wiederholende Aktualisierungen vorübergehend umgeht.

Update: Eigentlich nicht ein Problem mit Bulk-Update so viel wie es mit Transaktionen und FlushMode für Abfragen ist. Aber trotzdem, was zum Teufel macht NH, wenn es flusht?

3voto

Trent Punkte 1992

Das war ein gutes Stück. Ich hatte jede Aktualisierung in einer Transaktion, und innerhalb dieser Transaktion war eine Abfrage, die auf zweiter Ebene zwischengespeichert wurde, aber einen Flush verursachte. Wenn Sie Abfragen in einer Transaktion haben und FlushMode=Auto (im Grunde nicht ausgeschaltet), erhalten Sie einen Flush. Das ist extrem teuer, besonders wenn man viele Objekte im Session-Cache hat, was bei uns der Fall ist. Wenn man diese Abfrage aus der Transaktion herausnimmt, erhöht sich die Abfragezeit um den Faktor 5. Wenn man das Ganze in eine Transaktion umwandelt, anstatt einzelne Transaktionen durchzuführen, ist das ein weiterer großer Fortschritt, da jedes transaction.commit einen Flush auslöst. Die Aktualisierung von 1000 Objekten dauert weniger als 30 Sekunden, und ich schäme mich zu sagen, wie lange das vorher war. Ahh, veralteter Code.

Aktualisieren: Nach weiteren Untersuchungen habe ich den FlushMode für unser spezifisches verschachteltes Transaktionsmodell auf Commit gesetzt. Ohne zu sehr ins Detail zu gehen, haben wir ein spezielles Transaktionsmodell, das verschachtelte Transaktionen bei der Verwendung von verschachtelten "Logic"-Aufrufen berücksichtigt. Für Legacy-Anwendungen wollen wir dies nicht generell festlegen. Das spezielle Problem in diesem Fall ist die Kombination aus der Verwendung von Transaktionen und der Einstellung des FlushMode auf Auto (oder Always).

1voto

Mauricio Scheffer Punkte 97391

Während die Standard-ISession für Massenoperationen nicht empfohlen wird, können Sie entweder eine zustandslose Sitzung o DML stattdessen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X