Stapelverarbeitung in JDBC

Stapelverarbeitung in JDBC

1. Einführung

Java Database Connectivity (JDBC) ist eine Java-API, die für die Interaktion mit Datenbanken verwendet wird. Bei der Stapelverarbeitung werden mehrere Abfragen zu einer Einheit zusammengefasst und in einer einzelnen Netzwerkreise an eine Datenbank übergeben.

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ührungsartikelhere.

2. Warum Stapelverarbeitung?

Leistung und Datenkonsistenz sind die Hauptgründe für die Stapelverarbeitung.

2.1. Verbesserte Leistung

In einigen Anwendungsfällen muss eine große Datenmenge in eine Datenbanktabelle eingefügt werden. Unter Verwendung von JDBC können Sie dies unter anderem ohne Stapelverarbeitung erreichen, indem Sie mehrere Abfragen nacheinander ausfü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 Verwendung der 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 zusammenhängenden Transaktion, bei der die Reihenfolge der übertragenen Abfragen wichtig ist.

Alle Fehler, die während der Ausführung auftreten, sollten zu einem Rollback der Daten führen, die von vorherigen Abfragen gepusht wurden, sofern vorhanden.

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 this situation there is no rollback of the data inserted by the first statement, leading to data inconsistency.

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 undPreparedStatement, um Abfragen in der Datenbank auszuführen. Beide Klassen haben ihre eigene Implementierung der MethodenaddBatch() undexecuteBatch(), die uns die Stapelverarbeitungsfunktionalität bieten.

3.1. Stapelverarbeitung mitStatement

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

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

Der Rückgabetyp vonexecuteBatch() ist einint-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();

Im obigen Beispiel versuchen wir, Datensätze mitStatement in die TabellenEMPLOYEE undEMP_ADDRESSeinzufügen. Wir können sehen, wie SQL-Abfragen im auszuführenden Stapel hinzugefügt werden.

3.2. Stapelverarbeitung mitPreparedStatement

PreparedStatement ist eine weitere Klasse, die zum Ausführen von SQL-Abfragen verwendet wird.. Sie ermöglicht die Wiederverwendung von SQL-Anweisungen und erfordert, dass wir für jede Aktualisierung / Einfügung neue Parameter festlegen.

Sehen wir uns ein Beispiel mitPreparedStatement. an. Zuerst richten wir die Anweisung mit einer SQL-Abfrage ein, die alsString: 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 vonString-Werten und fügen dem Stapel eine neu konfigurierte Abfrage hinzu.

Sobald die Schleife beendet ist, führen wir den Batch 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 mitPreparedStatement. in die TabelleEMPLOYEEein. 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 unter Verwendung von JDBC ist.

Wie immer befindet sich der Code zu diesem Artikel inover on Github.