Heterogene Aktualisierungen im Stapelbetrieb mit Parametern

Mit pureQuery können Sie Anweisungen INSERT, UPDATE und DELETE, die auf verschiedene Tabellen verweisen, im Stapelbetrieb ausführen. Aufgrund dieser heterogenen Aktualisierungen im Stapelbetrieb können alle zugeordneten Tabellen in einem Netzumlauf zum Server aktualisiert werden. Bei diesem Verfahren heterogener Aktualisierungen im Stapelbetrieb rufen Sie eine Methode auf, um pureQuery gegenüber anzugeben, dass Sie eine Aktualisierung im Stapelbetrieb starten.
Einschränkung: Zur Verwendung dieser Funktion müssen von der Anwendung SQL-Anweisungen für eine DB2-Datenbank ausgeführt werden, die unter Linux, UNIX, Windows oder z/OS ausgeführt wird. Die Anwendung muss über IBM® Data Server Driver für JDBC und SQLJ eine Verbindung zur betreffenden Datenbank herstellen. Ziehen Sie die Systemvoraussetzungen zu Rate, um zu ermitteln, welche Version dieses Treibers für die verwendete Version von pureQuery erforderlich ist.

Alle nachfolgenden SQL-Anweisungen, deren Ausführung in der angegebenen Verbindung durch die Anwendung angefordert wird, werden im Speicher in die Warteschlange gestellt. Von pureQuery werden Dummy-Ergebnisse an die Anwendung zurückgegeben, um anzugeben, dass jede Anweisung erfolgreich ausgeführt wurde, obwohl die Anweisungen noch gar nicht ausgeführt wurden. Sie rufen eine Methode auf, die gegenüber pureQuery angibt, dass eine Aktualisierung im Stapelbetrieb beendet wird. An diesem Punkt werden von pureQuery alle in die Warteschlange gestellten SQL-Anweisungen ausgeführt.

Verwenden Sie in SQL-Anweisungen Fragezeichen ("?"), um anzugeben, wo Werte durch Methoden an die betreffenden Anweisungen übergeben werden. Sie können auch Name oder ?#.Name verwenden. Name muss auf eine Eigenschaft in einem Objekt java.util.Map<String> oder in einer Bean verweisen. Weitere Informationen zu Parametermarken finden Sie in Parametermarken in SQL-Anweisungen.

Stapelprozess

  1. Rufen Sie die Methode startBatch() auf, um den Start des Stapels von SQL-Anweisungen anzugeben:
    data.startBatch(HeterogeneousBatchKind.heterogeneousModify_);
    Nach Aufrufen dieser Methode werden von pureQuery alle SQL-Anweisungen, deren Ausführung in der Anwendung für die gleiche Implementierung der Schnittstelle Data angefordert wird, in die Warteschlange gestellt. INSERT-, UPDATE- und DELETE-Anweisungen werden von pureQuery so lange in die Warteschlange gestellt, bis von der Anwendung die Methode endBatch() aufgerufen wird. Während die Anweisungen von pureQuery in die Warteschlange gestellt werden, werden Dummy-Ergebnisse an die Anwendung zurückgegeben, um anzugeben, dass die Anweisungen erfolgreich ausgeführt wurden.

    Die Anwendung kann anfordern, dass nur INSERT-, UPDATE- und DELETE-Anweisungen ausgeführt werden. Von pureQuery werden alle anderen Typen von SQL-Anweisungen zurückgewiesen, und diese Anweisungen werden nicht für Ihre Verbindung ausgeführt. Wenn die Anwendung einen anderen Typ von SQL-Anweisung übergibt, wird von pureQuery eine Ausnahmebedingung ausgelöst und alle Anweisungen gelöscht, die für den Stapel in die Warteschlange gestellt wurden. Außerdem wird von pureQuery die Anweisung, durch die die Ausnahmebedingung verursacht wurde, nicht ausgeführt.

    Wenn von der Anwendung die Methode startBatch() erneut aufgerufen wird, bevor die Methode endBatch() aufgerufen wird, wird der Stapelprozess von pureQuery gestoppt, die in die Warteschlange gestellten Anweisungen gelöscht und RuntimeException ausgelöst.

  2. Rufen Sie die Methode endBatch() auf, um das Ende des Stapels von SQL-Anweisungen anzugeben und pureQuery zu veranlassen, die in die Warteschlange gestellten Anweisungen auszuführen.
    int[][] endBatch();
    Die in die Warteschlange gestellten Anweisungen werden von pureQuery in einem Netzdurchlauf ausgeführt. Von der Methode wird ein zweidimensionales Integer-Array der Aktualisierungszähler zurückgegeben, die von den Methoden update() und updateMany() zurückgegeben worden wären. Die Größe der ersten Dimension entspricht der Anzahl Anforderungen, die von der Anwendung zum Ausführen der SQL-Anweisungen übergeben wurden Die Größe der zweiten Dimension ist entweder:
    1
    Gibt an, dass eine Methode update() stapelorientiert war.
    n
    Wenn eine Methode updateMany() stapelorientiert war, ist n die Anzahl Datenzeilen in der Methode updateMany().
Wenn durch die Anwendung ermittelt werden muss, ob die Methode startBatch(), aber noch nicht die Methode endBatch() übergeben wurde, kann zu diesem Zweck die Methode getBatchKind() verwendet werden.
HeterogeneousBatchKind getBatchKind();
Wenn ein Stapel in Bearbeitung ist, wird von der Methode heterogeneousModify_ zurückgegeben. Wenn kein Stapel in Bearbeitung ist, wird von der Methode hetergeneousNone_ zurückgegeben.

Von der Anwendung kann die Methode updateMany() zwischen dem Aufruf der Methoden startBatch() und endBatch() aufgerufen werden. Von der Methode updateMany() kann eine einzelne SQL-Anweisung INSERT, UPDATE oder DELETE mehrmals für ein einzelnes Datenbankobjekt aufgerufen werden. Weitere Informationen zu dieser Methode finden Sie in Aktualisierungen einzelner Datenbankobjekte im Stapelbetrieb mit der Methode updateMany() der Schnittstelle 'Data'.

Voraussetzungen

Von allen integrierten Methoden und mit Annotationen versehenen Methoden, von denen die SQL-Anweisungen als Bestandteil der Aktualisierung im Stapelbetrieb ausgeführt werden, muss das gleiche Objekt Data gemeinsam genutzt werden. Dies erfolgt geringfügig unterschiedlich, abhängig von der Mischung der durch die Benutzeranwendung verwendeten pureQuery-Methoden.

Nur integrierte Methoden
Erstellen Sie eine Instanz von Data, die Sie für die Aktualisierung im Stapelbetrieb verwenden können, so wie im folgenden Beispiel:
Data data = DataFactory.getData(jdbcConnection);
data.startBatch(...);
// weitere Methoden von Data, durch die die Data-Instanz "data" verwendet wird
data.endBatch();
Nachdem die Methode endBatch() durch die Anwendung aufgerufen wurde, kann die Data-Instanz für verschiedene Zwecke verwendet werden, falls Sie dies möchten.
Integrierte Methoden und mit Annotationen versehene Methoden
Erstellen Sie eine Data-Instanz und übergeben Sie diese Instanz, um die Schnittstellen zu instanziieren, durch die die mit Annotationen versehenen Methoden deklariert werden, so wie im folgenden Beispiel:
Data data = DataFactory.getData (jdbcConnection);
// verwenden Sie jetzt "data" zum Instanziieren der verwendeten Schnittstellen
EmployeeInterface emp = DataFactory.getData (EmployeeInterface.class, data);
DepartmentInterface dept = DataFactory.getData (DepartmentInterface.class, data);
data.startBatch(...);
// weitere Methoden von Data und mit Annotationen versehene Methoden (EmployeeInterface und DepartmentInterface)
data.endbatch();
Nur mit Annotationen versehene Methoden
Instanziieren Sie die erste Schnittstelle und verwenden Sie dann diese Schnittstelle zum Instanziieren aller weiteren Schnittstellen. Implementierungen, die von DataFactory zurückgegeben werden, dienen zur Erweiterung einer Implementierung der Schnittstelle Data. Zum Aufrufen der Data-Methoden in der Implementierung setzen Sie die Implementierung in den Typ 'Data' um.
EmployeeInterface emp = DataFactory.getData (EmployeeInterface.class, jdbcConnection);
DepartmentInterface dept = DataFactory.getData (DepartmentInterface.class, (Data) emp);
Data data = (Data) emp;
data.startBatch(...);
// weitere mit Annotationen versehene Methoden (EmployeeInterface und DepartmentInterface)
data.endbatch();
Achtung: Datenobjekte sind nicht threadsicher. Nutzen Sie sie nicht threadübergreifend. Verwenden Sie ein Objekt Data nur in dem Thread, es erstellt wurde.

Ausnahmebedingungen

Für die Datenbank stellen alle SQL-Anweisungen zwischen startBatch() und endBatch() eine Transaktion dar. Der Aufruf von commit() oder rollback() nach startBatch() und vor dem Aufruf von endBatch() bewirkt, dass der Stapel nicht ausgeführt wird und die in die Warteschlange gestellten Anforderungen verloren gehen. Schließlich wird durch pureQuery eine RuntimeException ausgelöst.

Werden SQL-Ausnahmebedingungen (SQLExceptions) vom JDBC-Treiber zurückgegeben, sind sie in einer Ausnahmebedingung UpdateManyException eingeschlossen.

Falls durch die Methode endBatch() eine UpdateManyException verursacht wird, kann durch die Anwendung die Methode int[][] getHeterogeneousUpdateCounts() aufgerufen werden, dieden Aktualisierungszähler in Form eines zweidimensionalen Arrays zurückgibt, so als wäre der Stapel normal beendet worden.


Feedback