Führt executeBatch () von JDBC Anweisungen parallel oder nacheinander aus
Ich möchte Einträge aus mehreren Tabellen in einer postgreSQL-Datenbank löschen. Die Tabellen haben Fremdschlüsseleinschränkungen, daher muss ich sie nur in einer bestimmten Reihenfolge löschen (andernfalls schlägt das Löschen fehl).
Ich denke darüber nach, sie einem Stapel hinzuzufügen und executeBatch () auszuführen.
Ich verstehe, dass executeBatch alle Anweisungen zusammen an den Treiber sendet, aber wie werden Anweisungen ausgeführt? Wird die Löschreihenfolge gemäß der Reihenfolge des Hinzufügens zur Charge beibehalten? Ich kann es nicht im API-Dokument finden
Antworten
Die JDBC 4.3-Spezifikation spezifiziert explizit das Verhalten einer Stapelausführung in Abschnitt 14.1.2 Erfolgreiche Ausführung :
Stapelbefehle werden seriell (zumindest logisch) in der Reihenfolge ausgeführt, in der sie dem Stapel hinzugefügt wurden.
und
Die Einträge im Array sind in der Reihenfolge geordnet, in der die Befehle verarbeitet wurden (was wiederum der Reihenfolge entspricht, in der die Befehle ursprünglich zum Stapel hinzugefügt wurden).
Das "zumindest logisch" gibt Datenbanken einen gewissen Spielraum, um Dinge als Optimierung neu zu ordnen, solange das resultierende Verhalten das gleiche ist, als ob der Stapel in der angegebenen Reihenfolge ausgeführt worden wäre. Die Ausführung in der richtigen Reihenfolge ist auch erforderlich, um sicherzustellen, dass die Anzahl der zurückgegebenen Aktualisierungen übereinstimmt, und um das Ausnahmeverhalten zu gewährleisten.
Sie werden der Reihe nach ausgeführt.
Der Zweck des "Batching" besteht darin, die SQL-Anweisungen zu sammeln und als Block, eine Folge von Anweisungen, zu übertragen, um den Netzwerkaufwand für die Kommunikation mit dem Datenbankserver zu verringern.
Ein vollständiges "SQL senden, auf Antwort warten" benötigt Zeit. Durch das gleichzeitige Senden mehrerer Anforderungen kann viel Wartezeit vermieden werden.