Die Hauptforschung in diesem Artikel ist die Sitzung von Hibernate und Isolation. Die spezifische Einführung und Beispiele sind wie folgt.
Schauen wir uns zuerst einige Konzepte an:
1. Dirty Reading: Dirty Reading wird auch als Lesen ungültiger Daten bezeichnet. Dies bedeutet, dass während des Datenbankzugriffs T1 einen bestimmten Wert modifiziert und T2 dann den Wert liest. Danach storniert T1 die Änderung des Wertes aus irgendeinem Grund, wodurch die von T2 gelesenen Daten ungültig sind. Dirty Lesen bedeutet, dass wenn etwas auf Daten zugreift und die Daten geändert wird und diese Änderung nicht in die Datenbank übermittelt wurde, auch eine andere Sache auf diese Daten zugreift und dann diese Daten verwendet. Da diese Daten noch nicht eingereicht werden, sind die Daten, die von einer anderen Sache gelesen wurden, schmutzige Daten, und die auf den schmutzigen Daten basierenden Vorgänge sind falsch.
2. Nicht wiederholt Lesen: Als ich zum Beispiel einen Beitrag las, waren die Daten, die ich fand, Zhang San und Li Si. Dann, nachdem ich erfrischt hatte, stellte ich fest, dass der anfängliche Zhang San Zhang BA wurde. Dies ist die sogenannte nicht wiederholbare Lesart, da die von mir gelesenen Daten nicht wiederholt wurden.
3. Fantasy Reading: Als ich nach den Daten nachging, fing ich an, 3 Datensätze zu finden. Als ich es aktualisierte, stellte ich fest, dass die Aufzeichnungen 8 wurden. Dies ist Fantasy -Lesung.
4. Senden Sie Lesung: Sie können erst nach der Einreichung lesen. Oracle ist standardmäßig. Auf diese Weise gibt es kein schmutziges Lesen.
5. Wiederholbarkeit: Es ist offensichtlich das Gegenteil von nicht wiederholbarem Lesen. Es kann nicht wiederholbares Lesen vermeiden, dies kann jedoch nicht das Lesen des Phantoms vermeiden.
6. Serialisierung: Diese Methode ist sehr streng. Wenn ich etwas tue, kann es niemand sonst tun, wenn ich etwas tue. Es ist sehr sicher, aber äußerst ineffizient.
Im Folgenden verwenden wir praktische Beispiele, um die Anwendung von Hibernate -Cache -Clearance zu verstehen.
Die Hibernate -Mapping -Datenbank bezieht sich auf die Strategie der Primärschlüsselgenerierung.
Beispiele für die Erzeugung von Primärschlüssel in UUID:
public class user {private String uid; private String uname; privates Datum Geburtstag; public String getUid () {return uid;} public void setUid (String uid) {this.uid = uid;} public String Getuname () {return Unname;} public void setuname (String uname) {this.uname setBirthday (Datum Geburtstag) {this.birthday = Geburtstag;}}User.hbm.xml:
<? package = "com.lixue.bean"> <! Name = "Geburtstag"/> </class> </hibernate-Mapping>
Testmethode:
/ ***Testen Sie die Strategie für die UUID Primary Key Generation*/ public void testsave1 () {/*definierte Sitzung und Dinge*/ Session Session = null; Transaktionstransaktion = NULL; Versuchen Sie { /*Session und Dinge erhalten* / session = hibernateUtils.getSession (); Transaction = Session.BeginTransaction (); /*Benutzer erstellen*/ user user = new user (); user.Setuname ("xi jinping"); user.setBirthday (neues Datum ()); / *** Da die Primärschlüsselerzeugungsstrategie des Benutzers uUid ist, enthält er nach dem Aufrufen von Speichern nur den Benutzer in Sitzungsverwaltung* Die Einfügeanweisung wird nicht ausgestellt, die ID wurde jedoch generiert, und der Status der existenzinteressung in PersistenContext ist falsch*/ session.save (Benutzer). /** * Aufrufen von Flush, Hibernate, wird den Cache (Einfügen der Objekte in die temporäre Sammlung in Sitzungen-> Insertionen in die Datenbank ein, und löschen Sie die temporäre Sammlung) * Zu diesem Zeitpunkt können die Daten nicht in der Datenbank angezeigt werden, aber wenn die Isolierungsstufe der Datenbank auf eine Stellungnahme eingestellt ist. Session.flush (); /** * Sachen * Senden * Standardmäßig führt der Commit -Operation einen Flush -Reinigungs -Cache aus, * sodass die Daten nach dem Aufrufen von Flush ohne Anzeige * comit * transaction.commit () nicht zurückgerollt werden können; } catch (Ausnahme e) {e.printstacktrace (); Transaktion.Rollback (); } endlich {HibernateUtils.Closession (Sitzung); }} Wir können das Programm durch Haltepunkte debuggen:
1. Da die Nebenrate der Primärschlüsselerzeugung des Benutzers uUid ist, kann nach dem Aufrufen der SAVE () -Methode das Benutzerobjekt nur in die Sitzungsverwaltung aufgenommen werden, und die Einfügungsanweisung wird nicht ausgestellt, aber die ID wurde generiert (Hinweis: Zwei Orte sind nach dem Speichern sehr wichtig. Zunächst ist ein Element. Es gibt ein Element. PersistenContext-> Entityententries-> MAP-> Tabelle-> Ein bestimmtes Array-Element-> Wert speichert das Objekt. Wie im Bild gezeigt:
2. Nach dem Aufrufen der Flush () -Methode wird der temporäre gespeicherte Wert von Actionqueue in der Sitzung gelöscht, und dann wird der Wert von existindatabase im persistencontext auf true gesetzt, was darauf hinweist Daten. Nach dem Aufrufen der comment () -Methode befinden sich Daten in der Datenbank.
Beispiel für die Erzeugung von Primärschlüssel auf native Weise:
public class user1 {private Integer uid; private String uname; privates Datumsgeburtstag; public Integer getuid () {return uid;} public void setUid (Integer uid) {this.uid = uid;} public String Getuname () {return Unname; Geburtstag;} public void setBirthday (Datum Geburtstag) {this.birthday = Geburtstag;}}User1.hbm.xml:
<? package = "com.lixue.bean"> <! <Eigenschaft name = "uname"/> <Eigenschaft name = "Geburtstag"/> </class> </hibernate-Mapping>
Testmethode:
/ ***Testen Sie native Strategie der Primärschlüsselgenerierung*/ public void testsave2 () {/*Definierte Sitzung und Dinge*/ Sitzung Session = NULL; Transaktionstransaktion = NULL; Versuchen Sie { /*Session und Dinge erhalten* / session = hibernateUtils.getSession (); Transaction = Session.BeginTransaction (); /*Benutzer erstellen*/ user1 user = new user1 (); user.Setuname ("li keqiang"); user.setBirthday (neues Datum ()); / *** Da die Strategie der primären Schlüsselgenerierung von Benutzer1 nach dem Aufruf von Sitzungen nativ ist. Transaction.Commit (); } catch (Ausnahme e) {e.printstacktrace (); Transaktion.Rollback (); } endlich {HibernateUtils.Closession (Sitzung); }} Debuggen Sie das Programm über Breakpoint:
1. Da die Strategie der primären Schlüsselgenerierung nativ ist, wird nach dem Aufrufen der Save () -Methode die Einfügeanweisung ausgeführt, und die Daten im temporären Sammlungsobjekt werden gelöscht und die von der Datenbank generierte ID wird zurückgegeben.
2. Einbeziehen Sie das Objekt in die Sitzungsverwaltung ein, ändern Sie die existIndatabase -Eigenschaft in PersistenContext in true (gibt an, dass in der Datenbank entsprechende Daten vorhanden sind, es jedoch aufgrund des Isolationsbereichs nicht ersichtlich ist).
Lassen Sie uns eine andere Methode des Hibernate testen, dh EVICT (), was bedeutet, das Objekt aus der Sitzung zu vertreiben.
Für das Programm, das eine UUID -Primärschlüsselstrategie generiert, finden Sie hier eine Testmethode:
/ ***Testen Sie die Strategie für die UUID -Primärschlüsselgenerierung*/ public void testsave3 () {/*definierte Sitzung und Dinge*/ Session Session = null; Transaktionstransaktion = NULL; Versuchen Sie { /*Session und Dinge erhalten* / session = hibernateUtils.getSession (); Transaction = Session.BeginTransaction (); /*Benutzer erstellen*/ user user = new user (); user.Setuname ("hu jintao"); user.setBirthday (neues Datum ()); /*** Da die Primär -Tastenerzeugungsstrategie des Benutzers uUid ist, wird nach dem Aufrufen von Speichern nur die Session -Management* die Anweisung INSERT nicht ausgeben, die ID wurde jedoch generiert. Der Status der Existenzierung in der Sitzung ist falsch */ session.save (Benutzer); /*REIBICTION Das Benutzerobjekt aus der Sitzung, dh aus der Eigenschaft von Entityentrenies der PersistenContext*/ session.evict (Benutzer) ausgewiesen; /** * kann nicht erfolgreich einreichen, denn wenn der Hibernate den Cache aufräumt, wird das Benutzerobjekt aus der Sitzung vorübergehende Sammlung zum Einfügen * Nach dem Betrieb muss die Existenzinformatabase in der Eigenschaft enttentries eingesetzt werden. Transaction.Commit (); } catch (Ausnahme e) {e.printstacktrace (); Transaktion.Rollback (); } endlich {HibernateUtils.Closession (Sitzung); }} Debugging über Haltepunkte:
1. Da die Primär -Tastenerzeugungsstrategie von UUID verwendet wird, wird die Einfügungsanweisung nicht nach dem Aufrufen der Save () -Methode gesendet. Das Objekt ist im Sitzungsmanagement enthalten. Die ID wurde generiert und es gibt keine entsprechenden Daten in der Datenbank (dh der existindatabase -Attributwert ist falsch).
2. Nach dem Aufrufen von EVICT () vertreiben Sie das Benutzerobjekt aus der Sitzung, dh aus der Eigenschaft der Entitätserung des PersistenContext.
3. Wenn ich erneut die comment () -Methode nenne, werden wir feststellen, dass unsere Daten nicht gespeichert werden können, da unsere Existenz -INDATABASE -Eigenschaft falsch war, dh keine entsprechenden Daten in der Datenbank. Dann haben wir Evil () angerufen, um alle Objekteigenschaften in Persistencontext zu löschen (die ExistenzIndatabase -Eigenschaft ist ebenfalls enthalten), aber die temporären gespeicherten Daten in ActionQueue wurden nicht gelöscht. Wenn wir die methode () nennen, werden wir zunächst die Flush () -Methode aufrufen. Die Funktion dieser Methode wurde auch bereits erwähnt. Es wird das temporäre Objekt in die Actionqueue einfügt und dann den Wert existatabase -Eigenschaft im Persistencontext auf true festgelegt. Leider gibt es keine existierende Eigenschaft im PersistenCeContext, sodass ein Fehler auftritt, was zu einer Speicherung der Unfähigkeit führt.
Dazu verbessern wir das obige Verfahren:
/ ***Testen Sie die Strategie für die UUID -Primärschlüsselgenerierung*/ public void testsave4 () {/*definierte Sitzung und Dinge*/ Sitzung Session = null; Transaktionstransaktion = NULL; Versuchen Sie { /*Session und Dinge erhalten* / session = hibernateUtils.getSession (); Transaction = Session.BeginTransaction (); /*Benutzer erstellen*/ user user = new user (); user.Setuname ("hu jintao"); user.setBirthday (neues Datum ()); /*** Da die Primär -Tastenerzeugungsstrategie des Benutzers uUid ist, wird nach dem Aufrufen von Speichern nur die Session -Management* die Anweisung INSERT nicht ausgeben, die ID wurde jedoch generiert. Der Status der Existenzinformation in Persistencontext ist falsch */ session.save (Benutzer); / ***Nach dem Flush wird der Hibernate den Cache reinigen, das Benutzerobjekt in der Datenbank speichern, das Benutzerobjekt in den Einfügen in der Sitzung*löschen und den Status von existIndatabase in PersistenContext auf true*/ session.flush () festlegen. / * Das Benutzerobjekt aus der Sitzung aus der Sitzung aus der Eigenschaft von PersistenContext */ session.evict (Benutzer) erteilen; / *** kann erfolgreich eingereicht werden, da Hibernate bei der Reinigung des Cache* nicht in der Sitzungsinsertionssammlung enthalten sein kann. } catch (Ausnahme e) {e.printstacktrace (); Transaktion.Rollback (); } endlich {HibernateUtils.Closession (Sitzung); }} HINWEIS: Nach dem Speichern rufen wir die Flush () -Methode auf und rufen dann die EVICT () -Methode nach dem geänderten Programm auf.
Debugging über Haltepunkte:
1. Da es sich immer noch um eine UUID -Generierungsstrategie handelt, wird nach dem Aufrufen der Save die Einfügeerklärung nicht ausgestellt, das Objekt ist jedoch in das Sitzungsmanagement enthalten. Die existierische Eigenschaft in Persistencontext ist falsch.
2. Nach dem Aufrufen von Save () nennen wir die Flush () -Methode erneut. Die Funktion dieser Methode besteht darin, den Cache zu reinigen, dh eine Einfügeanweisung auszugeben, das temporäre Objekt in die Insertionen in der Sitzung in die Datenbank einzufügen, dann die temporäre Sammlung zu löschen und die existIndatabase -Eigenschaft in der PersistenContext in true festlegen.
3. Nach dem Aufrufen von Flush () wird die EVICT () -Methode aufgerufen. Seine Funktion besteht darin, das Benutzerobjekt aus der Sitzung zu entfernen, dh die Entitätserklärung des Persistencontexts.
4. Nach dem Aufrufen der EVICT () -Methode ruft die comment () -Methode implizit die Flush () -Methode auf. Die Funktion von Flush besteht darin, den Cache zu löschen, dh das Objekt in die Sitzung der Sitzung-> Insertions Temporäre Sammlung in die Datenbank einfügen, aber wir haben die Methode von Flush () zuvor aufgerufen (Hinweis: Nach dem Aufrufen dieser Methode wird die temporäre Sammlung gelöscht), sodass die temporäre Sammlung überhaupt keine Objekte hat, sodass die Einfügung nicht ausgegeben wird. Es wird den existierischen Status in PersistenContext nicht aktualisieren. Erfolgreich einreichen.
Betrachten wir die Verwendung der EVICT () -Methode in der Strategie der nativen Primärschlüsselgenerierung:
/ ***Testen Sie die native Strategie für die Primärschlüsselgenerierung*/ public void testsave5 () {/*Definierte Sitzung und Dinge*/ Session Session = NULL; Transaktionstransaktion = NULL; Versuchen Sie { /*Session und Dinge erhalten* / session = hibernateUtils.getSession (); Transaction = Session.BeginTransaction (); /*Benutzer erstellen*/ user1 user = new user1 (); user.Setuname ("ma ying-jeou"); user.setBirthday (neues Datum ()); / *** Da die Strategie der primären Schlüsselgenerierung von Benutzer1 nach dem Aufruf von Sitzungen nativ ist. /* Das Benutzerobjekt aus der Sitzung erteilen, dh aus der Eigenschaft von Entityentrenies der PersistenContext*/ session.evict (Benutzer) ausgewiesen; / *** kann erfolgreich eingereicht werden, da Hibernate in der Sammlung von Sitzungen bei der Reinigung von Cache* nicht gefunden werden kann. Das Benutzerobjekt kann nicht gefunden werden, sodass die Einfüge nicht ausgestellt wird, noch der Status von existIndatabase in der Sitzung wird nicht aktualisiert*/ transaction.commit (); } catch (Ausnahme e) {e.printstacktrace (); Transaktion.Rollback (); } endlich {HibernateUtils.Closession (Sitzung); }} Durch Debugging:
1. Da die Strategie der Primärschlüsselgenerierung nativ ist, wird nach dem Aufrufen der Speichernmethode eine Einfügungsanweisung sofort ausgestellt, wobei die von der Datenbank generierte ID zurückgegeben wird und das Objekt in die Sitzungsverwaltung einbezieht, wobei die Existenz -Intatabase -Eigenschaft in PersistenCeContext zu true geändert wird, dh entsprechende Daten in der Datenbank, und die Objekte in der vorübergehenden Sammlung sind klar. Aufgrund der MySQL -Isolationsstufe können wir die Daten jedoch nicht sehen, bevor wir sie begehen.
2. Nach dem Aufrufen von Save wird das Objekt aufgerufen und das Objekt aus der Sitzung ausgeschlossen, dh es wird aus den Entitätsinstitut im persistencontext ausgewiesen.
3. Nachdem die methode evict () die methode aufgerufen hat, kann die comment () -Methode erfolgreich aufgerufen werden. Das Komitee kann erfolgreich gespeichert werden, da die Methode von Flush () vor dem Aufrufen von commit () implizit bezeichnet wird, dh den Cache reinigen und nach Objekten in der temporären Sammlung in die Datenbank einfügen. Sie werden jedoch feststellen, dass in der temporären Sammlung keine Daten vorhanden sind, sodass die Einfügung nicht ausgestellt wird, und die Existenzinde -Eigenschaft im Persistencontext wird nicht aktualisiert.
In den obigen Fällen können wir sehen, dass wir manchmal die Flush () -Methode aufrufen müssen, um den Cache zu reinigen. Darüber hinaus haben wir aus den oben genannten ein Problem gefunden, dh wenn wir die Daten speichern (), können wir die Daten nicht sehen, bevor sie sie senden, dh die Isolationsstufe der Datenbank ist begrenzt. Sprechen wir nun über die Isolationsstufe von MySQL:
1. Überprüfen Sie die aktuelle Isolationsstufe der MySQL -Datenbank:
Wählen Sie @@ Tx_isolation;
Hinweis: Aus der Abbildung können wir sehen, dass die Standard-Isolationsstufe der MySQL-Datenbank wiederholbar ist, was bedeutet, dass es keine nicht wiederholbare Lektüre gibt, dh sie muss eingereicht werden, bevor es gelesen werden kann.
2. Ändern Sie die aktuelle Isolationsstufe von MySQL (unter der Annahme, dass sie nicht zum Lesen eingereicht wird, dh es kann ohne Commit gelesen werden):
set transaction isolation level read uncommited;
Das obige ist die detaillierte Erklärung des Session_flush- und Isolationsebene -Codes von Hibernate. Ich hoffe, es wird für alle hilfreich sein. Interessierte Freunde können weiterhin auf andere verwandte Themen auf dieser Website verweisen. Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen. Vielen Dank an Freunde für Ihre Unterstützung für diese Seite!