Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wenn ich PreparedStatement.cancel() in einer JDBC-Anwendung aufrufe, wird es tatsächlich in einer Oracle-Datenbank beendet?

Bitte beachten Sie, dass das, was ich unten sage, auf Beobachtungen und Schlussfolgerungen von Oracle im Einsatz basiert und nicht auf einem tiefen Verständnis der Interna von Oracle basiert. Nichts davon sollte als maßgeblich angesehen werden.

Was Nineside in ihrem ersten Absatz gesagt hat, ist richtig. Achten Sie jedoch auf den vorgeschlagenen Test. Nicht alle lang andauernden Orakelabfragen sind gleich. Es scheint, dass Abfragen über zwei Phasen ausgewertet werden, zuerst eine Phase, die genügend Daten kombiniert, um zu wissen, wie die Zeilen in der richtigen Reihenfolge zurückgegeben werden, und zweitens eine Phase, die die Zeilen zurückgibt, die die Lücken füllen, die nicht berechnet wurden erste Phase. Die Arbeitsteilung zwischen den beiden Phasen wird auch durch die Einstellungen des kostenbasierten Optimierers beeinflusst. z.B. Erste Reihen vs. Alle Reihen.

Wenn sich die Abfrage nun in Phase 1 befindet, scheint die Abbruchanforderung bestenfalls in die Warteschlange gestellt zu werden, um am Ende von Phase 1 angewendet zu werden, was bedeutet, dass die Abfrage weiter ausgeführt wird.

In Phase 2 werden Zeilen in Bündeln zurückgegeben, und nach jedem Bündel kann der Abbruchbefehl wirksam werden. Vorausgesetzt, der Treiber unterstützt den Befehl, führt die Abbruchanforderung dazu, dass die Abfrage beendet wird.

Die Spezifikation für den JDBC-Abbruchbefehl scheint nicht zu sagen, was passieren soll, wenn die Abfrage nicht aufhört zu laufen, und daher kann der Befehl auf die Bestätigung des Abbruchs warten oder eine Zeitüberschreitung verursachen und mit der noch laufenden Abfrage zurückkehren.