2009-05-18 6 views
2

Es wurde vorgeschlagen, dass, um die Leistung unseres Systems zu verbessern, die Verwendung von Lazy Loading sollte auf der ganzen Linie verwendet werden. Das heißt, das OneToOne-Mapping mit der Eigenschaft "mappedBy" in das @ OneToMany-Mapping zu ändern. Dadurch wird das Laden unerwünschter Daten aus der Datenbank angegangen und gestoppt, was zu einer Langsamkeit der Anwendungen führt.Um Lazy Load oder nicht in Anstrengung, um die Leistung zu verbessern

Wir betreiben ein Multi-Tier-System (im Wesentlichen 2-Tier). Wir haben das Frontend - mit JSF und dem Backend, das die Business- und Datenbankzugriffsschichten enthält. Vorder- und Rückseite kommunizieren EJB - aber EJB haben keine echte Logik in ihnen. Andere Technologie verwendet - Frühling und Hibernate

Jetzt, nach einigem Lesen auf dem Thema, scheint es, dass die Verwendung des faulen Ladens kein Silberkugel darin ist, dass es richtig angewendet werden muss. Für jedes Lazy-Laden wird eine Select-Anweisung ausgegeben, um die Daten abzurufen. Es gibt auch das Problem, dass wenn das Frontend Zugriff auf eine Eigenschaft hat, die Lazy geladen werden soll und die Sitzung/Verbindung am Backend geschlossen wird, dann erhalten wir eine Null.

Ist das obige ein richtiges Problem?

Also, was ist der beste Ansatz/die beste Vorgehensweise bei der Implementierung einer Lazy Loading-Lösung oder Leistungsverbesserung? Die Hoffnung besteht nicht darin, das Datenmodell möglichst wiederherzustellen.

Meine erste Idee war jedoch, mit der DBA-Gruppe zu arbeiten, um ein Ideal zu bekommen, was zwischen den beiden Systemen vor sich geht - wie die Abfragen aussehen, wie wir die Daten verwenden etc. Fehlerpunkte identifizieren, das Hibernate-Objekt untersuchen/Abfragen, um zu sehen, wie sie am besten zu verbessern sind. Auch um das Frontend zu betrachten, um zu bestimmen, was und wie die Daten von der Rückseite an die Front übergeben werden usw.

Guter Ansatz/andere Ansätze?

Antwort

0

Lazy Loading ist ideal, um teure Operationen zu verzögern, aber ich stimme Ihrer Schlussfolgerung zu, dass es keine Wunderwaffe ist, um alle Leistungsprobleme zu lösen.

Gehen Sie mit Ihrem Bauchgefühl und einige Analyse zuerst, um zu sehen, wo die wirklichen Leistungsprobleme in der Anwendung sind. Es kann sich herausstellen, dass das verzögerte Laden einiger Daten eine gute Lösung sein wird, oder es könnte etwas völlig anderes sein. Es gibt wirklich keine Möglichkeit, das zu sagen, bis Sie anfangen, zu profilieren und zu analysieren, was in der App passiert.

8

Die allererste Sache, die Sie tun sollten, ist Ihre Anwendung zu messen und herauszufinden, was genau Ihre Leistungsprobleme verursacht.

Verwenden Sie ein Tool wie JProfiler, um herauszufinden, wo die Probleme sind.

Sobald Sie wissen, was vor sich geht, können Sie dann entscheiden, wie Sie es beheben werden.

Wenn Sie einfach ein Lazy-Loading-Schema implementieren, ohne zu wissen, was Ihre Leistungsprobleme verursacht, ist das eine Verschwendung Ihrer Zeit.

Wenn Sie feststellen, dass Ihr Problem auf der DB-Schicht liegt, können Sie die involvierten DBAs dazu bringen, herauszufinden, ob Ihr Schema/Ihre Abfragen verbessert werden können, bevor Sie etwas Radikaleres tun.

+1

Ich bin normalerweise falsch, wo ich denke, die Verlangsamungen sind, so habe ich gelernt zu profilieren, anstatt zu erraten. –

+1

@James, yeah, ich wurde zu oft gebissen, um zu versuchen, den Engpass zu erraten. Es ist einfacher, schneller und genauer, den Code irgendwie zu messen, bevor irgendwelche Änderungen vorgenommen werden. – Glen

0

Es hängt so viel davon ab, was Sie versuchen zu tun, dass es schwer zu sagen ist. Ihre Idee, zu Ihrem DBA zu gehen, könnte definitiv produktiv sein. Das einzige, was die Leute vielleicht tun können, ist einige Beispiele zu geben. In meinem Fall:

Lazy Loading war eine enorme Leistungsverbesserung für uns im folgenden Szenario.Wir hatten einen riesigen Baum mit 15.000 Knoten mit verschiedenen Ebenen. Ursprünglich haben wir versucht den ganzen Baum zu laden und dann zu rendern. Es dauerte Jahrhunderte. Wir haben den Code geändert, um die Zweige nur dann zu laden, wenn der Benutzer die Knoten erweitert hat. Bei der Knotenerweiterung dauert es etwas länger, aber die Anwendung fühlt sich insgesamt schneller an. In diesem Fall ist es sinnvoll, das Mapping zu ändern

Jetzt, wenn Sie den gesamten Baum sowieso verarbeiten müssen, weil es von Ihrer Geschäftslogik benötigt wird, wird Lazy Loading keinen großen Unterschied machen. In diesem Fall ist das Ändern des Mappings wirklich keine Lösung, und es könnte sogar teurer sein.

Sie müssen ein wenig darüber nachdenken, was Ihre Anwendung macht, wo es sich langsam anfühlt, was Sie erreichen wollen. Einen Profiler herauszuziehen ist auch kein Wundermittel.

Ohne konkrete Beispiele aus Ihrer Anwendung macht es keinen Sinn zu sagen, ob Lazy Loading nützlich ist oder nicht.

2

Es ist wahr, dass, wenn das Abrufen von Daten die Ladezeiten verlangsamt, das Lazy Loading eine großartige Lösung ist. Aber es scheint eine vorzeitige Optimierung zu sein. Sie würden es wahrscheinlich für jeden Datensatz optimieren und dann testen, ob es die App beschleunigt. Wenn nicht, dann ist es kein guter Kandidat für das faule Laden.

Die Art, wie ich das verzögerte Laden implementiert habe, verursachte keine Änderung in der Datenebene. Es war alles in der Business-Logik und Präsentations-Controller. Da ich mit EJB nicht vertraut bin, gehe ich davon aus, dass dies für deine Java App funktionieren wird. Wie auch immer, wenn ich das träge Laden implementiere, lade ich keine Daten (atleat keine der Daten, die ich träge laden werde), bis es benötigt wird. Dann rufe ich die Datenebene auf und erhalte meine Daten (oder eine Teilmenge der Daten).

Wie bei den Verbindungsproblemen müssen Sie Prüfungen durchführen, um die Datenverbindung zu testen, um festzustellen, ob sie geschlossen ist. Das heißt, Sie bündeln die Datenverbindungen. Wenn die Verbindung geschlossen ist, öffnen Sie sie erneut. Wie bei der eigentlichen Implementierung des verzögerten Ladens sollte dies jedoch in Ihren Logikklassen und nicht im Frontend erfolgen, sodass Sie diese Funktionalität nicht mehrmals duplizieren müssen.

Verwandte Themen