2013-08-09 6 views
10

Wie mein Titel beschrieben, verwende ich Ruhezustand Auto Flush-Modus-Mechanismus in meiner Anwendung. Wenn ich also Daten in einem persistenten Hibernate-Objekt ändere, spiegelt es sich automatisch in der Datenbank wider. Ich will das nicht. Also habe ich eine Lösung gefunden, stattdessen FlushMode Commit zu verwenden.Was zu verwenden Flush-Modus 'Auto' oder 'Commit'

So, hier ist meine eigentliche Frage:

  • Ist es besser Commit Spülmodus statt Auto zu benutzen? und
  • Was bedeutet diese Aussage aus der Dokumentation?

    Die Sitzung wird manchmal vor der Ausführung der Abfrage in der Reihenfolge geleert, um sicherzustellen, dass Abfragen den veralteten Status nie zurückgeben.

http://docs.jboss.org/hibernate/orm/3.5/javadoc/org/hibernate/FlushMode.html

+0

Überprüfen Sie den Link http://www.cpe.ku.ac.th/~plw/oop/e_book/hibernate_in_action.pdf und blättern Sie zu Seite 5.1.3 Spülen der Sitzung. Prost., –

+0

Was Sie suchen, ist Transaktionen. Sie sollten (im Allgemeinen) Transaktionen verwenden, um festzulegen, wann Dinge an die Datenbank übergeben werden, anstatt die Sitzung manuell zu leeren: https://community.jboss.org/wiki/SessionsAndTransactions?_sscc=t –

Antwort

6

Hibernate (und JPA) wurden entwickelt, um Änderungen persistenter Objekte in der Datenbank automatisch zu erkennen und persistent zu machen. Es gibt keine "Speichern" -Operation.

Wenn Sie nicht möchten, dass Dinge gespeichert werden, sollten Sie losgelöste Objekte verwenden. Verwenden Sie entweder eine StatelessSession, um sie zu laden, oder rufen Sie los, nachdem Sie Ihre Objekte geladen haben. Dadurch werden sie aus der Überwachung entfernt, die sie automatisch speichert.

Nicht mit den Spülung Einstellungen, es wird nur Kopfschmerzen später.

+0

Können Sie angeben, welche Art von Kopfschmerzen es Ihnen geben könnte? Wir betrachten dies als eine Lösung und möchten wissen, ob es nicht die richtige Lösung ist. – fool4jesus

+0

Nehmen wir an, Sie haben einen Schreibvorgang, der einen Fehler verursacht. Weitere verzögerte Flushes bedeuten, dass Sie den Fehler erst nach mehreren Abfragen erhalten. Ich hoffe, Sie wollten keinen Benutzer informieren! Oder nehmen wir an, dass Ihre schreibgeschützte Anwendung plötzlich geändert werden muss, um zu verfolgen, was Benutzer gerade suchen - für Messwerte, Berichte oder Überwachungszwecke. Jetzt müssen Sie jede einzelne Abfrage in Ihrer App erneut aufrufen. Das sind nur ein paar Beispiele aus dem Kopf. – Barett

+0

Danke @Barrett. Das sind genau die Art von Problemen, die wir gefunden haben. :-( – fool4jesus

6

es Spülmodus Commit statt Auto

besser zu nutzen ist

Wenn Ihre Anwendung Abfragen verwendet die FlushMode.COMMIT wird höchstwahrscheinlich eine bessere Leistung, weil es nicht bündig Sitzung vor jeder Abfrage. Ich weiß, dass es pro Javadoc Sitzung sollte nur wenn nötig flush, aber aus meiner Erfahrung führt FlushMode.COMMIT noch besser in Nur-Lese-Sitzungen. Auto-Flush bedeutet nicht, dass Änderungen am persistenten Objekt sofort in die Datenbank übertragen werden.

welche Bedeutung von unten Aussage ist in dem Dokument

Die Session manchmal vor der Ausführung der Abfrage, um gespült wird, um sicherzustellen, dass Anfragen nie abgestanden Zustand zurück.

Wie ich oben geschrieben habe, wenn FlushMode.AUTO (default) verwendet wird Sitzung vor jeder Abfrage spülen wird (HQL, Kriterien, SQL-Abfrage) an der Datenbank vorgenommen um sicherzustellen, dass Ergebnisse machen alle Elemente enthalten hinzugefügt innerhalb aktuelle Sitzung.

+0

FYI an Leser, diese Antwort steht im Gegensatz zur Hibernate-Dokumentation. https://docs.jboss.org/hibernate/orm/3.5/javadocs/org/hibernate/FlushMode.html – Barett

+3

Ich las zuerst die Dokumentation und kam dann hierher, und ich denke, diese Antwort erklärt deutlich, was in der Dokumentation gemeint ist. Obwohl "die Sitzung manchmal geleert wird ..." bedeutet nicht, dass sie vor jeder Abfrage geleert wird. Die Bedeutung von "manchmal" wird hier erklärt http://java.dzone.com/articles/dark-side-hibernate-auto-flush –

Verwandte Themen