Ich habe eine Anwendung, die NHibernate als ORM verwendet, und manchmal kommt es zu Leistungsproblemen aufgrund der Art und Weise, wie die Daten von ihr abgerufen werden. Was kann man tun, um die Leistung von NHibernate zu verbessern? (Bitte beschränken Sie sich auf eine Empfehlung pro Antwort)
Antworten
Zu viele Anzeigen?NHibernate erzeugt von Haus aus ziemlich schnelles SQL. Ich benutze es seit einem Jahr und musste bisher noch kein reines SQL damit schreiben. Alle meine Leistungsprobleme sind auf folgende Ursachen zurückzuführen Normalisierung und das Fehlen von Indizes.
Die einfachste Lösung besteht darin, die Ausführungspläne Ihrer Abfragen zu untersuchen und geeignete Indizes zu erstellen, insbesondere für Ihre Fremdschlüsselspalten. Wenn Sie Microsoft SQL Server verwenden, hilft Ihnen der "Database Engine Tuning Advisor" dabei sehr.
"Nur eine Empfehlung pro Antwort"? Dann würde ich mich für diese entscheiden:
Vermeiden Sie Join-Duplikate (auch kartesische Produkte genannt) aufgrund von Joins entlang zweier oder mehrerer paralleler to-many-Zuordnungen; verwenden Sie stattdessen Exists-subqueries, MultiQueries oder FetchMode "subselect".
Entnommen aus: Tipps zur Leistungsoptimierung von Hibernate
Wenn Sie nicht bereits (angemessen) mit Lazy Loading arbeiten, sollten Sie damit beginnen. Das Abrufen von Sammlungen, wenn Sie sie nicht brauchen, ist eine Verschwendung von allem.
Kapitel Verbesserung der Leistung beschreibt diese und andere Möglichkeiten zur Verbesserung der Leistung.
Profiling ist der erste Schritt - selbst bei einfachen, zeitlich begrenzten Einheitstests - um herauszufinden, wo die größten Gewinne erzielt werden können
Bei Sammlungen sollten Sie die Stapelgröße einstellen, um die Anzahl der ausgegebenen Select-Anweisungen zu reduzieren - siehe Abschnitt Verbesserung der Leistung für Details
Darf ich meine Antwort nur auf eine Option beschränken? In diesem Fall würde ich wählen, dass Sie den Second-Level-Cache-Mechanismus von NHibernate implementieren.
Auf diese Weise können Sie für jedes Objekt in Ihrer Mapping-Datei die Cache-Strategie festlegen. Der Second-Level-Cache hält bereits abgerufene Objekte im Speicher und macht daher keinen weiteren Roundtrip zur Datenbank. Dies ist ein enormer Leistungsschub.
Ihr Ziel ist es, die Objekte zu definieren, auf die Ihre Anwendung ständig zugreift. Dazu gehören allgemeine Einstellungen und Ähnliches.
Es gibt eine Fülle von Informationen zu nhibernate second level cache und wie man ihn implementiert.
Viel Glück :)