Batchbehandling i JDBC

Java Top

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN

1. Introduktion

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

I denne artikel finder vi ud af, 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 brugssager kræver, at en stor mængde data indsættes i en databasetabel. Mens du bruger JDBC, er en af ​​måderne til at opnå dette uden batchbehandling, at udføre flere forespørgsler sekventielt.

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

statement.execute ("INDSÆT I MEDARBEJDERE (ID, NAVN, BETEGNELSE)" + "VÆRDIER ('1', 'Medarbejdernavn1', 'Betegnelse1')"); statement.execute ("INDSÆT I MEDARBEJDERE (ID, NAVN, BETEGNELSE)" + "VÆRDIER ('2', 'Medarbejdernavn2', 'Betegnelse2')");

Disse sekventielle opkald øger antallet af netværksrejser til databasen, hvilket resulterer i dårlig ydeevne.

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

2.2. Datakonsistens

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

Eventuelle fejl, der opstår under udførelse, skal resultere i en tilbageførsel af data, der er skubbet af tidligere forespørgsler, hvis nogen.

Lad os se et eksempel på at tilføje data til flere tabeller:

statement.execute ("INDSÆT I MEDARBEJDERE (ID, NAVN, BETEGNELSE)" + "VÆRDIER ('1', 'Medarbejdernavn1', 'Betegnelse1')"); statement.execute ("INSERT IN 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 tilbageførsel af de data, der er indsat i den første erklæring, hvilket fører til dataoverskridelse.

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

3. Sådan gør du batchbearbejdning

JDBC tilbyder to klasser, Udmelding og PreparedStatement 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 Udmelding

Med JDBC er den enkleste måde at udføre forespørgsler på en database på via Udmelding objekt.

Først ved hjælp af 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 af executeBatch () er en int array, der angiver, hvor mange poster der var påvirket af udførelsen af ​​hver SQL-sætning.

Lad os se et eksempel på oprettelse og udførelse af en batch ved hjælp af Statement:

Erklæringserklæring = connection.createStatement (); statement.addBatch ("INDSÆT I MEDARBEJDERE (ID, NAVN, BETEGNELSE)" + "VÆRDIER ('1', 'Medarbejdernavn', 'Betegnelse')"); statement.addBatch ("INSERT IN EMP_ADDRESS (ID, EMP_ID, ADDRESS)" + "VALUES ('10', '1', 'Address')"); statement.executeBatch (); 

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

3.2. Batchbehandling ved hjælp af PreparedStatement

PreparedStatement 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 ved hjælp af PreparedStatement. Først konfigurerede vi udsagnet ved hjælp af en SQL-forespørgsel kodet som en Snor:

String [] EMPLOYEES = new String [] {"Zuck", "Mike", "Larry", "Musk", "Steve"}; String [] DESIGNATIONS = new String [] {"CFO", "CSO", "CTO", "CEO", "CMO"}; String insertEmployeeSQL = "INDSÆT I MEDARBEJDERE (ID, NAVN, BETEGNELSE)" + "VÆRDIER (?,?,?)"; PreparedStatement medarbejderStmt = connection.prepareStatement (insertEmployeeSQL);

Dernæst løber vi gennem en række Snor værdier og tilføj en nyligt konfigureret forespørgsel til batchen.

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

for (int i = 0; i <MEDARBEJDERE.længde; i ++) {String medarbejderId = UUID.randomUUID (). tilString (); medarbejderStmt.setString (1, medarbejder-id); medarbejderStmt.setString (2, MEDARBEJDERE [i]); medarbejderStmt.setString (3, BETEGNELSER [i]); medarbejderStmt.addBatch (); } medarbejderStmt.executeBatch (); 

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

4. Konklusion

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

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

Java bund

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN