In diesem Artikel wird die Verwendung von Hibernate zur Verwaltung von Sitzungs- und Batch-Vorgängen detailliert analysiert. Teilen Sie es als Referenz mit allen. Die spezifische Analyse lautet wie folgt:
Der Ruhezustand verwaltet die Sitzung
Hibernate selbst bietet drei Methoden zum Verwalten von Sitzungsobjekten: ① Der Lebenszyklus des Sitzungsobjekts ist an den lokalen Thread gebunden. ② Der Lebenszyklus des Sitzungsobjekts ist an die JTA-Transaktion gebunden. ③ Das Hibernate-Delegatprogramm verwaltet den Lebenszyklus des Sitzungsobjekts
In der Hibernate-Konfigurationsdatei wird das Attribut hibernate.current_session_context_class verwendet, um die Sitzungsverwaltungsmethode anzugeben. Zu den optionalen Werten gehören:
① Thread: Der Lebenszyklus des Session-Objekts ist an den lokalen Thread gebunden. ② JTA*: Der Lebenszyklus des Session-Objekts ist an die JTA-Transaktion gebunden. ③ Managed: Hibernate-Delegatprogramm zur Verwaltung des Lebenszyklus des Session-Objekts
Der Lebenszyklus des Sitzungsobjekts ist an den lokalen Thread gebunden:
Wenn der Attributwert hibernate.current_session_context_class der Hibernate-Konfigurationsdatei auf Thread gesetzt ist, verwaltet Hibernate die Sitzung auf eine Weise, die an den lokalen Thread gebunden ist.
Hibernate bindet die Sitzung gemäß den folgenden Regeln an den lokalen Thread:
Wenn ein Thread (Thread) zum ersten Mal die Methode getCurrentSession() des SessionFactory-Objekts aufruft, erstellt diese Methode ein neues Session-Objekt (SessionA), bindet das Objekt an ThreadA und gibt die Sitzung zurück, wenn ThreadA das SessionFactory-Objekt erneut aufruft Bei Verwendung der getCurrentSession()-Methode gibt diese Methode das sessionA-Objekt zurück. Wenn ThreadA die mit dem sessionA-Objekt verknüpfte Transaktion sendet, wird Hibernate automatisch geleert Cachen Sie das sessionA-Objekt, schreiben Sie dann die Transaktion fest und schließen Sie die Sitzung wie gewünscht. Wenn ThreadA die mit dem SessionA-Objekt verknüpfte Transaktion abbricht, wird das SessionA-Objekt ebenfalls automatisch geschlossen. Wenn ThreadA die Methode getCurrentSession() des SessionFactory-Objekts erneut aufruft, erstellt diese Methode ein neues Session-Objekt (SessionB) und bindet das Objekt daran threadA. und return sessionB
Verarbeiten Sie Daten stapelweise
Die Stapelverarbeitung von Daten bezieht sich auf die Verarbeitung einer großen Datenmenge in einer Transaktion und auf Stapelvorgänge im Prozess der Anwendungsschicht. Die Hauptmethoden sind wie folgt:
① Durch Sitzung
② HQL bestehen
③ Durch StatelessSession
④ Über die JDBC-API ---- Empfohlen, da sie am schnellsten ist
Die Sitzung führt Batch-Vorgänge aus:
Die Methoden save() und update() der Sitzung speichern die verarbeiteten Objekte in ihrem eigenen Cache. Wenn ein Sitzungsobjekt zur Verarbeitung einer großen Anzahl persistenter Objekte verwendet wird, sollten verarbeitete Objekte, auf die nicht erneut zugegriffen wird, rechtzeitig aus dem Cache geleert werden. Die spezifische Methode besteht darin, nach der Verarbeitung eines Objekts oder einer kleinen Menge von Objekten sofort die Methode „flush()“ aufzurufen, um den Cache zu aktualisieren, und dann die Methode „clear()“ aufzurufen, um den Cache zwischenzuspeichern.
Verarbeitungsvorgänge über Session unterliegen den folgenden Einschränkungen:
Die Anzahl der JDBC-Einzelstapelverarbeitungen muss in der Hibernate-Konfigurationsdatei festgelegt werden. Es sollte sichergestellt werden, dass die Anzahl der Stapel von SQL-Anweisungen, die jedes Mal an die Datenbank gesendet werden, mit dem Stapelgrößenattribut übereinstimmt.
Wenn das Objekt den „Identity“-Identifier-Generator verwendet, kann Hibernate keine Batch-Einfügungsvorgänge in JDBC durchführen.
Bei der Durchführung von Batch-Vorgängen wird empfohlen, den Second-Level-Cache von Hibernate zu deaktivieren
Codedemonstration zum Batch-Einfügen von Daten:
Kopieren Sie den Code und der Code lautet wie folgt: News news = null;
for(int i = 0; i < 10000; i++) {
news = neue News();
news.setTitle("--" + i);
session.save(news);
if((i + 1) % 20 == 0) {
session.flush();
session.clear();
}
}
Stapelaktualisierung: Bei der Stapelaktualisierung ist es natürlich nicht ratsam, alle Objekte auf einmal in den Sitzungscache zu laden und sie dann einzeln im Cache zu aktualisieren.
Verwenden Sie die scrollbare Ergebnismenge org.hibernate.ScrollableResults. Dieses Objekt enthält eigentlich keine Objekte, sondern nur den Cursor, der zum Online-Suchen von Datensätzen verwendet wird. Nur wenn das Programm auf ein bestimmtes Element des ScrollableResults-Objekts zugreift, lädt es das entsprechende Objekt in die Datenbank.
Das Objekt org.hibernate.ScrollableResults wird von der Scroll-Methode von Query zurückgegeben
Batch-Operationen über HQL:
Hinweis: HQL unterstützt nur Einfügeanweisungen in der Form INSERT INTO...SELECT, jedoch keine Einfügeanweisungen in der Form INSERT INTO...VALUES. Daher können Stapeleinfügungsvorgänge nicht mit HQL durchgeführt werden
Stapeloperationen über StatelessSession:
Formal ähnelt die Verwendung von StatelessSession der von Session. Im Vergleich zu Session weist StatelessSession die folgenden Unterschiede auf:
StatelessSession verfügt über keinen Cache und über StatelessSession geladene, gespeicherte oder aktualisierte Objekte befinden sich in einem freien Zustand.
StatelessSession interagiert nicht mit dem Cache der zweiten Ebene von Hibernate. Wenn Sie die Methoden save(), update() oder delete() von StatelessSession aufrufen, führen diese Methoden sofort die entsprechende SQL-Anweisung aus, anstatt nur die Ausführung einer SQL-Anweisung zu planen.
StatelessSession führt keine Dirty-Prüfung durch. Nach dem Ändern der Eigenschaften des Kundenobjekts müssen Sie daher die update()-Methode von StatelessSession aufrufen, um die Daten in der Datenbank zu aktualisieren.
StatelessSession führt keine kaskadierenden Operationen an den zugehörigen Objekten durch. Das Kundenobjekt mit OID 1 wird zweimal über dasselbe StatelessSession-Objekt geladen. Die Speicheradressen der beiden erhaltenen Objekte sind unterschiedlich.
Die von StatelessSession ausgeführten Vorgänge können vom Interceptor-Interceptor erfasst werden, werden jedoch vom Ereignisverarbeitungssystem von Hibernate ignoriert.
Ich hoffe, dass dieser Artikel für die Java-Programmierung aller hilfreich sein wird.