Elaborazione batch in JDBC

Java Top

Ho appena annunciato il nuovo corso Learn Spring , incentrato sui fondamenti di Spring 5 e Spring Boot 2:

>> SCOPRI IL CORSO

1. Introduzione

Java Database Connectivity (JDBC) è un'API Java utilizzata per interagire con i database. L'elaborazione batch raggruppa più query in un'unica unità e le trasmette in un unico viaggio di rete a un database.

In questo articolo scopriremo come utilizzare JDBC per l'elaborazione in batch di query SQL.

Per ulteriori informazioni su JDBC, puoi consultare il nostro articolo introduttivo qui.

2. Perché l'elaborazione in batch?

Le prestazioni e la coerenza dei dati sono i motivi principali per eseguire l'elaborazione batch.

2.1. Prestazione migliorata

Alcuni casi d'uso richiedono l'inserimento di una grande quantità di dati in una tabella di database. Durante l'utilizzo di JDBC, uno dei modi per ottenere ciò senza l'elaborazione batch, è eseguire più query in sequenza.

Vediamo un esempio di query sequenziali inviate al database:

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

Queste chiamate sequenziali aumenteranno il numero di viaggi di rete al database con conseguente riduzione delle prestazioni.

Utilizzando l'elaborazione batch, queste query possono essere inviate al database in una chiamata, migliorando così le prestazioni.

2.2. Coerenza dei dati

In alcune circostanze, i dati devono essere inseriti in più tabelle. Ciò porta a una transazione correlata in cui la sequenza di query inviate è importante.

Eventuali errori che si verificano durante l'esecuzione dovrebbero comportare un rollback dei dati inviati dalle query precedenti, se presenti.

Vediamo un esempio di aggiunta di dati a più tabelle:

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')"); 

Un problema tipico nell'approccio precedente si verifica quando la prima istruzione ha esito positivo e la seconda istruzione ha esito negativo. In questa situazione non vi è alcun rollback dei dati inseriti dalla prima istruzione, con conseguente incoerenza dei dati.

Possiamo ottenere la coerenza dei dati estendendo una transazione su più inserimenti / aggiornamenti e quindi eseguendo il commit della transazione alla fine o eseguendo un rollback in caso di eccezioni, ma in questo caso, stiamo ancora colpendo ripetutamente il database per ogni istruzione.

3. Come eseguire l'elaborazione in batch

JDBC fornisce due classi, Statement e PreparedStatement per eseguire query sul database. Entrambe le classi hanno la propria implementazione dei metodi addBatch () ed executeBatch () che ci forniscono la funzionalità di elaborazione batch.

3.1. Elaborazione batch tramite istruzione

Con JDBC, il modo più semplice per eseguire query su un database è tramite l' oggetto Statement .

Per prima cosa, usando addBatch () possiamo aggiungere tutte le query SQL a un batch e quindi eseguire quelle query SQL usando executeBatch () .

Il tipo restituito di executeBatch () è un array int che indica quanti record sono stati influenzati dall'esecuzione di ciascuna istruzione SQL.

Vediamo un esempio di creazione ed esecuzione di un batch utilizzando Statement:

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(); 

Nell'esempio precedente, stiamo cercando di inserire record nelle tabelle EMPLOYEE e EMP_ADDRESS utilizzando Statement . Possiamo vedere come le query SQL vengono aggiunte nel batch da eseguire.

3.2. Elaborazione batch mediante PreparedStatement

PreparedStatement è un'altra classe utilizzata per eseguire query SQL . Consente il riutilizzo delle istruzioni SQL e richiede di impostare nuovi parametri per ogni aggiornamento / inserimento.

Vediamo un esempio utilizzando PreparedStatement. Innanzitutto, impostiamo l'istruzione utilizzando una query SQL codificata come stringa:

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);

Successivamente, eseguiamo un ciclo attraverso un array di valori String e aggiungiamo una query appena configurata al batch.

Una volta terminato il ciclo, eseguiamo il batch:

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(); 

Nell'esempio mostrato sopra, stiamo inserendo record nella tabella EMPLOYEE utilizzando PreparedStatement. Possiamo vedere come i valori da inserire vengono impostati nella query e poi aggiunti al batch da eseguire.

4. Conclusione

In questo articolo abbiamo visto come l'elaborazione batch delle query SQL sia importante durante l'interazione con i database utilizzando JDBC.

Come sempre, il codice relativo a questo articolo può essere trovato su Github.

Fondo Java

Ho appena annunciato il nuovo corso Learn Spring , incentrato sui fondamenti di Spring 5 e Spring Boot 2:

>> SCOPRI IL CORSO