Dieser Artikel beschreibt das Prinzip und die Implementierungsmethode der Ladeverzögerung von Winterschlafverzögerungen. Teilen Sie es für Ihre Referenz wie folgt weiter:
Um die Leistung von Hibernate weiter zu optimieren, können Sie verwenden:
Latenzbelastungstechnologie, Verwaltung von Datenkriechstrategien und Durchführung von Cache -Management zur Verbesserung der Leistung von Winterschlaf.
1. Verzögerung der Belastung (Last)
Lazy Loading ist ein von Hibernate bereitgestellter Mechanismus zur Verbesserung der Programmausführungseffizienz, dh er wird nur erstellt, wenn die Daten des Objekts tatsächlich verwendet werden.
Der Prozess der faulen Belastung: Verzögerungsbelastung wird durch den Proxy -Mechanismus erreicht. Wenn Hibernate Daten aus einem bestimmten Objekt aus einer Datenbank erhält, beim Erhalten des Sammlungsattributwerts eines Objekts oder beim Erhalten eines anderen Objekts, das einem Objekt zugeordnet ist, wird der Hibernate nicht verwendet, da die Daten des Objekts nicht verwendet werden (außer der Kennung), sondern lädt die tatsächlichen Daten nicht aus der Datenbank, sondern erstellt nur ein Proxy -Objekt für das Objekt, um das Objekt darzustellen. Alle Attribute für dieses Objekt sind die Standardwerte. Dieses reale Objekt wird nur erstellt, wenn die Daten des Objekts wirklich verwendet werden müssen und seine Daten tatsächlich aus der Datenbank geladen werden.
Wenn die methode load () in der Sitzung aufgerufen wird, um eine Entität zu laden; Wenn die Sitzung eine Entität lädt, wird der Sammelattributwert in der Entität mit verzögertem Laden geladen. Wenn die Sitzung eine Entität lädt, wird das andere Entitätsobjekt, das die Entität eingeleitet hat, die verzögerte Belastung für ein anderes Entitätsobjekt verwendet
Schalten Sie faule Laden aus: Wenn Sie eine einzelne Entität laden, können Sie die Methode get () verwenden.
Für Sammelattribute in Entitäten können Sie diesem Satz Attribut Lazy = "False" hinzufügen (<Set>, <Bag>, <List>…). Wenn eine einstufige Assoziation eines anderen Entitätsobjekts, können Sie <Eins-zu-Eins>, <viele zu eins> zum Hinzufügen von Attribut Lazy = "False" in der Mapping-Datei hinzufügen: Eins-zu-Eins kann nicht eingeschränkt haben
2. Die Haupttypen von faulen Laden werden standardmäßig in Hibernate verwendet:
• Lazy Loading wird verwendet, wenn die LOAD () -Methode in der Sitzung aufgerufen wird, um eine Entität zu laden.
• Wenn eine Sitzung eine Entität lädt, werden die Sammlungsattributwerte in dieser Entität mit Verzögerung geladen. (Eins-zu-Many)
• Wenn eine Sitzung eine Entität lädt, ist ein anderes Entitätsobjekt, das einsatz (eins zu eins, viele zu eins) ist, die der Entität zugeordnet sind, faul geladen.
• Der Unterschied zwischen dem zweiten und dritten ist: Im zweiten Fall ist die Methode zur Aufhebung der Verzögerung das Laden des LAZY -Ladeattributs Lazy = "False" nach dem festgelegten Tag der Zuordnungsdatei der einen Partei mit dem Set -Attribut; Im dritten Fall ist das viele-zu-Eins-Tag in der Zuordnungsdatei der Mehrfachpartei mit viel zu eins, dh das viele-zu-Eins-Tag, festgelegt.
Objekte, die faul geladen werden können, sind alle umgeschriebene Proxy -Objekte. Wenn die zugehörige Sitzung nicht geschlossen ist, wird der Zugriff auf die Eigenschaften dieser faulen, geladenen Objekte (Proxy) (außer Getid und GetClass) Hibernate diese Proxy initialisieren oder Hibernate verwenden. Wenn die zugehörige Sitzung geschlossen ist, tritt eine Ausnahme auf, um auf das faule geladene Objekt zuzugreifen.
3. Crawl -Strategie (Fetch)
Konfigurieren Sie die "Crawl -Richtlinie", um den Abfrageeffekt der Methoden Get () und Load () der Sitzung direkt zu beeinflussen.
CRABS-Strategie für ein-geplante Assoziationen <viele zu eins> <eintune_one>:
Sie können Abrufenattributen zu den zugehörigen Zuordnung von Mapping-Elementen hinzufügen. Wählen Sie: Laden Sie das Laden; Join: Verwenden Sie eine Intra-Connection in derselben Auswahlanweisung, um die Daten des Objekts und die Daten seines zugehörigen Objekts zu erhalten. Zu diesem Zeitpunkt ist die Verzögerungsbelastung des zugehörigen Objekts ungültig.
Kriechstrategie für Sammeleigenschaften :
Wählen Sie: Laden Sie das Laden; Join: Verwenden Sie die Intra-Joining in derselben Auswahlanweisung, um den Association-Set der anderen Partei zu erhalten. Zu diesem Zeitpunkt ist der Faule am zugehörigen Satz ungültig. Unterauswahl: Senden Sie eine andere Abfrageanweisung oder Unterabfrage zum Kriechen. Diese Strategie funktioniert auch für HQL -Abfragen.
4. LaZy Last Fallanalyse
Fall 1: Eine einzelne Entität ruft die methode load () auf, um das LAY -Laden abzubrechen
Paket com.hbsi.test; import org.hibernate.session; import org.junit.test; import com.hbsi.domain.user; HibernateUtil.getSession (); user user = (user) session.get (user.class, 1); // system.out.println (user.getName (); hibernateUtil.close (); // Hinweis hier: Auch wenn die Sitzung geschlossen ist und der Benutzer im verwalteten Zustand ist, kann der Benutzerobjekt noch verwendet werden. Dies liegt daran, dass dieses Objekt, obwohl es sich im verwalteten Zustand befindet, ein Objekt mit Attributwerten ist und es nicht löscht, sondern den Kanal nur für seinen Umgang mit der Datenbank isoliert. System.out.println (user.getName ());} // testload () Methode; Führen Sie die SQL -Anweisung nicht aus und führen Sie nur @TestPublicVoid testload () {sessions session = hibernateUtil.getSession () aus; user user = (user) session.load (user.class, 1); // Die Ausgabem -ID hier führt die SQL -Anweisung nicht aus. Es wird die ID direkt aus der ID erhalten, die Sie oben übergeben haben. Es wird nicht aus der Datenbank gesucht, sodass das SQL -Anweisungssystem.out.println (user.getId ()); // Der Ausgabenname ist unterschiedlich. Zu diesem Zeitpunkt wird das Proxy -Objekt tatsächlich instanziiert. Dies ist das Proxy -Objekt mit dem Namensattribut. Zu diesem Zeitpunkt können Sie auch dann, wenn Sie die Sitzung schließen, den Namen über dieses Objekt erhalten. Wenn Sie diesen Satz kommentieren, das heißt, das Proxy -Objekt instanziiert das Proxy -Objekt nicht und führt dann das Attribut für den Ausgabennamen nach dem Schließen der Sitzung aus. Ein Fehler wird gemeldet: Kann Proxy // system.out.println (user.getName () nicht initialisieren.Situation 2: Lazy Loading am Set abbrechen
Testen Sie, ob das faule Laden im Sammlungsattribut in der Zuordnungsdatei auf False eingestellt ist, wird mit den Daten in der Bestellentabelle zusammengestellt, dh zwei Auswahlanweisungen
@Testpublicvoid find () {session sission = hibernateUtil.getSession (); customer cus = (customer) session.get (customer.class, 3); Wenn fauler Laden verwendet wird, werden zuerst zwei SQL -Anweisungen ausgegeben, und das Ausgabeergebnis ist // Die Methode kann hier nicht direkt an die Ausgabe cus.getord (). getoname () angekettet werden; Weil cus.getord () ein festgelegter Set -Set <ordners> orders = cus.getord (); System.err.println (orders.size ()); hibernatutil.close ();} zurückgibt;Methode 3: <ein-zu-Eins>, <viele zu eins> Lazy Loading abbrechen
@Testpublicvoid find () {// standardmäßig faul laden, dh eine mit einer SQL -Anweisung ausgeben; Wenn die Verzögerungsbelastung auf False eingestellt ist und zwei SQL -Anweisungen ausgibt, finden Sie unerwünschte Kundeninformationen. Sitzung Session = hibernateUtil.getSession (); Bestellungen ord = (Bestellungen) Sitzung.get (Bestellungen.Class, 3); System.out.println (ord.getoname ()); hibernatutil.close ();};};};};Ich hoffe, dass die Beschreibung in diesem Artikel für Java -Programme aller hilfreich ist, die auf dem Hibernate -Framework basieren.