Java >> Java tutorial >  >> Tag >> Jdbc

Batchbehandling i JDBC

1. Introduktion

Java Database Connectivity (JDBC) er en Java API, der bruges til at interagere med databaser. Batchbehandling grupperer flere forespørgsler i én enhed og sender dem i en enkelt netværksrejse til en database.

I denne artikel vil vi opdage, hvordan JDBC kan bruges til batchbehandling af SQL-forespørgsler.

For mere om JDBC, kan du tjekke vores introduktionsartikel her.

2. Hvorfor batchbehandling?

Ydeevne og datakonsistens er de primære motiver til at udføre batchbehandling.

2.1. Forbedret ydeevne

Nogle use cases kræver, at en stor mængde data indsættes i en databasetabel. Mens du bruger JDBC, er en af ​​måderne at opnå dette uden batchbehandling ved at udføre flere forespørgsler sekventielt.

Lad os se et eksempel på sekventielle forespørgsler sendt til databasen:

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

Disse sekventielle opkald vil øge antallet af netværksture til databasen, hvilket resulterer i dårlig ydeevne.

Ved at bruge batchbehandling kan disse forespørgsler sendes til databasen i ét opkald, hvilket forbedrer ydeevnen.

2.2. Datakonsistens

Under visse omstændigheder skal data skubbes ind i flere tabeller. Dette fører til en indbyrdes relateret transaktion, hvor rækkefølgen af ​​forespørgsler, der sendes, er vigtig.

Eventuelle fejl, der opstår under udførelsen, bør resultere i en tilbagerulning af de data, der er pushet af tidligere forespørgsler, hvis nogen.

Lad os se et eksempel på tilføjelse af data til flere tabeller:

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

Et typisk problem i ovenstående tilgang opstår, når den første sætning lykkes, og den anden sætning mislykkes. I denne situation er der ingen tilbagerulning af de data, der er indsat af den første sætning, hvilket fører til datainkonsistens.

Vi kan opnå datakonsistens ved at spænde over en transaktion på tværs af flere indsættelser/opdateringer og derefter udføre transaktionen i slutningen eller udføre en tilbagerulning i tilfælde af undtagelser, men i dette tilfælde rammer vi stadig databasen gentagne gange for hver erklæring.

3. Sådan laver du batchbehandling

JDBC leverer to klasser, Statement og Prepared Statement at udføre forespørgsler på databasen. Begge klasser har deres egen implementering af addBatch() og executeBatch() metoder, der giver os batchbehandlingsfunktionaliteten.

3.1. Batchbehandling ved hjælp af erklæring

Med JDBC er den nemmeste måde at udføre forespørgsler på en database på via erklæringen objekt.

Først ved at bruge addBatch() vi kan tilføje alle SQL-forespørgsler til en batch og derefter udføre disse SQL-forespørgsler ved hjælp af executeBatch() .

Returtypen for executeBatch() er en int array, der angiver, hvor mange poster der blev påvirket af udførelsen af ​​hver SQL-sætning.

Lad os se et eksempel på at oprette og udføre en batch ved hjælp af 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();

I ovenstående eksempel forsøger vi at indsætte poster i EMPLOYEE og EMP_ADDRESS tabeller ved hjælp af Statement . Vi kan se, hvordan SQL-forespørgsler tilføjes i den batch, der skal udføres.

3.2. Batchbehandling ved hjælp af PreparedStatement

Forberedt erklæring er en anden klasse, der bruges til at udføre SQL-forespørgsler. Det muliggør genbrug af SQL-sætninger og kræver, at vi indstiller nye parametre for hver opdatering/indsættelse.

Lad os se et eksempel med PreparedStatement. Først opsætter vi sætningen ved hjælp af en SQL-forespørgsel kodet som en String:

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

Dernæst går vi gennem en række String værdier og tilføje en nyligt konfigureret forespørgsel til batchen.

Når løkken er færdig, udfører vi batchen:

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

I eksemplet vist ovenfor indsætter vi poster i EMPLOYEE tabel ved hjælp af PreparedStatement. Vi kan se, hvordan værdier, der skal indsættes, indstilles i forespørgslen og derefter tilføjes til den batch, der skal udføres.

4. Konklusion

I denne artikel så vi, hvordan batchbehandling af SQL-forespørgsler er vigtig, mens du interagerer med databaser ved hjælp af JDBC.

Som altid kan koden relateret til denne artikel findes på Github.


Java tag