Ich habe Informationen über die flush () -Methode gesammelt, bin mir aber nicht ganz sicher, wann und wie ich sie richtig verwenden soll. Nach dem, was ich gelesen habe, ist mein Verständnis, dass der Inhalt des Persistenzkontexts mit der Datenbank synchronisiert wird, dh ausstehende Anweisungen ausgeben oder Entitätsdaten aktualisieren.
Jetzt habe ich folgendes Szenario mit zwei Entitäten A
und B
(in einer Eins-zu-Eins-Beziehung, aber nicht von JPA erzwungen oder modelliert). A
hat eine zusammengesetzte PK, die manuell eingestellt wird, und hat auch ein automatisch generiertes IDENTITY-Feld recordId
. Dies recordId
sollte B
als Fremdschlüssel an die Entität geschrieben werden A
. Ich spare A
und B
in einer einzigen Transaktion. Das Problem ist, dass der automatisch generierte Wert A.recordId
innerhalb der Transaktion nicht verfügbar ist, es sei denn, ich rufe em.flush()
nach dem Aufruf explizit em.persist()
an A
. (Wenn ich eine automatisch generierte IDENTITY PK habe, wird der Wert direkt in der Entität aktualisiert, aber das ist hier nicht der Fall.)
Kann em.flush()
bei Verwendung innerhalb einer Transaktion Schaden anrichten?
quelle
Machen
em.flush()
Sie mehr als nur das Senden der zwischengespeicherten SQL-Befehle. Es wird versucht, den Persistenzkontext mit der zugrunde liegenden Datenbank zu synchronisieren. Es kann viel Zeit in Ihren Prozessen verursachen, wenn Ihr Cache zu synchronisierende Sammlungen enthält.Vorsicht bei der Verwendung.
quelle
Ja, es kann Sperren in der Datenbank länger als nötig halten.
Im Allgemeinen delegieren Sie bei Verwendung von JPA die Transaktionsverwaltung an den Container (auch bekannt als CMT - mithilfe der @ Transactional-Annotation für Geschäftsmethoden). Dies bedeutet, dass eine Transaktion beim Eingeben der Methode automatisch gestartet und am Ende festgeschrieben / zurückgesetzt wird. Wenn Sie den EntityManager die Datenbanksynchronisierung durchführen lassen, wird die Ausführung von SQL-Anweisungen erst unmittelbar vor dem Festschreiben ausgelöst, was zu kurzlebigen Sperren in der Datenbank führt. Andernfalls behalten Ihre manuell geleerten Schreibvorgänge möglicherweise Sperren zwischen dem manuellen Löschen und dem automatischen Festschreiben bei, die je nach verbleibender Ausführungszeit der Methode lang sein können.
Stellt fest, dass eine Operation automatisch einen Flush auslöst: Ausführen einer nativen Abfrage für dieselbe Sitzung (EM-Status muss geleert werden, damit die SQL-Abfrage erreichbar ist), Einfügen von Entitäten mit der nativ generierten ID (von der Datenbank generiert, daher muss die Einfügeanweisung lauten ausgelöst, damit der EM die generierte ID abrufen und Beziehungen ordnungsgemäß verwalten kann)
quelle