Stapelverarbeitung in JDBC

Java Top

Ich habe gerade den neuen Learn Spring- Kurs angekündigt , der sich auf die Grundlagen von Spring 5 und Spring Boot 2 konzentriert:

>> Überprüfen Sie den Kurs

1. Einleitung

Java Database Connectivity (JDBC) ist eine Java-API, die für die Interaktion mit Datenbanken verwendet wird. Die Stapelverarbeitung gruppiert mehrere Abfragen in einer Einheit und leitet sie in einer einzigen Netzwerkreise an eine Datenbank weiter.

In diesem Artikel erfahren Sie, wie JDBC für die Stapelverarbeitung von SQL-Abfragen verwendet werden kann.

Weitere Informationen zu JDBC finden Sie in unserem Einführungsartikel hier.

2. Warum Stapelverarbeitung?

Leistung und Datenkonsistenz sind die Hauptmotive für die Stapelverarbeitung.

2.1. Verbesserte Leistung

In einigen Anwendungsfällen muss eine große Datenmenge in eine Datenbanktabelle eingefügt werden. Bei Verwendung von JDBC besteht eine Möglichkeit, dies ohne Stapelverarbeitung zu erreichen, darin, mehrere Abfragen nacheinander auszuführen.

Sehen wir uns ein Beispiel für sequentielle Abfragen an, die an die Datenbank gesendet werden:

statement.execute("INSERT INTO EMPLOYEE(ID, NAME, DESIGNATION) " + "VALUES ('1','EmployeeName1','Designation1')"); statement.execute("INSERT INTO EMPLOYEE(ID, NAME, DESIGNATION) " + "VALUES ('2','EmployeeName2','Designation2')");

Diese sequentiellen Aufrufe erhöhen die Anzahl der Netzwerkfahrten zur Datenbank, was zu einer schlechten Leistung führt.

Durch die Stapelverarbeitung können diese Abfragen in einem Aufruf an die Datenbank gesendet werden, wodurch die Leistung verbessert wird.

2.2. Datenkonsistenz

Unter bestimmten Umständen müssen Daten in mehrere Tabellen verschoben werden. Dies führt zu einer miteinander verbundenen Transaktion, bei der die Reihenfolge der geposteten Abfragen wichtig ist.

Fehler, die während der Ausführung auftreten, sollten zu einem Rollback der Daten führen, die gegebenenfalls durch vorherige Abfragen übertragen wurden.

Sehen wir uns ein Beispiel für das Hinzufügen von Daten zu mehreren Tabellen an:

statement.execute("INSERT INTO EMPLOYEE(ID, NAME, DESIGNATION) " + "VALUES ('1','EmployeeName1','Designation1')"); statement.execute("INSERT INTO EMP_ADDRESS(ID, EMP_ID, ADDRESS) " + "VALUES ('10','1','Address')"); 

Ein typisches Problem bei dem obigen Ansatz tritt auf, wenn die erste Anweisung erfolgreich ist und die zweite Anweisung fehlschlägt. In dieser Situation erfolgt kein Rollback der von der ersten Anweisung eingefügten Daten, was zu Dateninkonsistenzen führt.

Wir können Datenkonsistenz erreichen, indem wir eine Transaktion über mehrere Einfügungen / Aktualisierungen erstrecken und dann die Transaktion am Ende festschreiben oder in Ausnahmen einen Rollback durchführen. In diesem Fall wird die Datenbank jedoch für jede Anweisung wiederholt aufgerufen.

3. So führen Sie die Stapelverarbeitung durch

JDBC bietet zwei Klassen, Statement und PreparedStatement , um Abfragen in der Datenbank auszuführen. Beide Klassen haben ihre eigene Implementierung der Methoden addBatch () und executeBatch () , die uns die Stapelverarbeitungsfunktionalität bieten.

3.1. Stapelverarbeitung mit Anweisung

Mit JDBC können Abfragen in einer Datenbank am einfachsten über das Statement- Objekt ausgeführt werden .

Zuerst können wir mit addBatch () alle SQL-Abfragen zu einem Stapel hinzufügen und diese SQL-Abfragen dann mit executeBatch () ausführen .

Der Rückgabetyp von executeBatch () ist ein int- Array, das angibt, wie viele Datensätze von der Ausführung jeder SQL-Anweisung betroffen waren.

Sehen wir uns ein Beispiel für das Erstellen und Ausführen eines Stapels mit Statement an:

Statement statement = connection.createStatement(); statement.addBatch("INSERT INTO EMPLOYEE(ID, NAME, DESIGNATION) " + "VALUES ('1','EmployeeName','Designation')"); statement.addBatch("INSERT INTO EMP_ADDRESS(ID, EMP_ID, ADDRESS) " + "VALUES ('10','1','Address')"); statement.executeBatch(); 

In dem obigen Beispiel versuchen wir Aufzeichnungen in die einzufügen EMPLOYEE und EMP_ADDRESS Tabellen Statement . Wir können sehen, wie SQL-Abfragen in dem auszuführenden Stapel hinzugefügt werden.

3.2. Stapelverarbeitung mit PreparedStatement

PreparedStatement ist eine weitere Klasse, die zum Ausführen von SQL-Abfragen verwendet wird . Es ermöglicht die Wiederverwendung von SQL-Anweisungen und erfordert, dass wir für jedes Update / Insert neue Parameter festlegen.

Sehen wir uns ein Beispiel mit PreparedStatement an. Zuerst richten wir die Anweisung mithilfe einer SQL-Abfrage ein, die als Zeichenfolge codiert ist :

String[] EMPLOYEES = new String[]{"Zuck","Mike","Larry","Musk","Steve"}; String[] DESIGNATIONS = new String[]{"CFO","CSO","CTO","CEO","CMO"}; String insertEmployeeSQL = "INSERT INTO EMPLOYEE(ID, NAME, DESIGNATION) " + "VALUES (?,?,?)"; PreparedStatement employeeStmt = connection.prepareStatement(insertEmployeeSQL);

Als Nächstes durchlaufen wir ein Array von String- Werten und fügen dem Stapel eine neu konfigurierte Abfrage hinzu.

Sobald die Schleife beendet ist, führen wir den Stapel aus:

for(int i = 0; i < EMPLOYEES.length; i++){ String employeeId = UUID.randomUUID().toString(); employeeStmt.setString(1,employeeId); employeeStmt.setString(2,EMPLOYEES[i]); employeeStmt.setString(3,DESIGNATIONS[i]); employeeStmt.addBatch(); } employeeStmt.executeBatch(); 

In dem oben gezeigten Beispiel fügen wir Datensätze mit PreparedStatement in die EMPLOYEE- Tabelle ein . Wir können sehen, wie einzufügende Werte in der Abfrage festgelegt und dann dem auszuführenden Stapel hinzugefügt werden.

4. Fazit

In diesem Artikel haben wir gesehen, wie wichtig die Stapelverarbeitung von SQL-Abfragen bei der Interaktion mit Datenbanken mithilfe von JDBC ist.

Wie immer finden Sie den Code zu diesem Artikel auf Github.

Java unten

Ich habe gerade den neuen Learn Spring- Kurs angekündigt , der sich auf die Grundlagen von Spring 5 und Spring Boot 2 konzentriert:

>> Überprüfen Sie den Kurs