Batchbehandling i JDBC

Java Top

Jeg kunngjorde nettopp det nye Lær våren kurs, med fokus på det grunnleggende i vår 5 og vårstøvel 2:

>> KONTROLLER KURSET

1. Introduksjon

Java Database Connectivity (JDBC) er et Java API som brukes til å samhandle med databaser. Batchbehandling grupperer flere spørsmål i en enhet og sender den i en enkelt nettverksreise til en database.

I denne artikkelen vil vi oppdage hvordan JDBC kan brukes til batchbehandling av SQL-spørringer.

For mer om JDBC, kan du sjekke innledningsartikkelen vår her.

2. Hvorfor batchbehandling?

Ytelse og datakonsistens er de viktigste motivene for å gjøre batchbehandling.

2.1. Forbedret ytelse

Noen brukssaker krever at en stor mengde data settes inn i en databasetabell. Mens du bruker JDBC, er en av måtene å oppnå dette uten batchbehandling, å utføre flere spørsmål sekvensielt.

La oss se et eksempel på sekvensielle spørsmål sendt til databasen:

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

Disse sekvensielle anropene vil øke antall nettverksreiser til databasen, noe som resulterer i dårlig ytelse.

Ved å bruke batchbehandling kan disse spørsmålene sendes til databasen i en samtale, og dermed forbedre ytelsen.

2.2. Datakonsistens

Under visse omstendigheter må data skyves inn i flere tabeller. Dette fører til en sammenhengende transaksjon der sekvensen av spørsmål som blir presset er viktig.

Eventuelle feil som oppstår under utførelsen, bør resultere i tilbakeføring av data som er presset av tidligere spørsmål, hvis noen.

La oss se et eksempel på å legge til data i flere tabeller:

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

Et typisk problem i ovennevnte tilnærming oppstår når den første utsagnet lykkes og den andre utsagnet mislykkes. I denne situasjonen er det ingen tilbakeføring av dataene som er satt inn av den første uttalelsen, noe som fører til datainkonsistens.

Vi kan oppnå datakonsistens ved å sprenge en transaksjon på tvers av flere innsettinger / oppdateringer og deretter begå transaksjonen på slutten eller utføre tilbakestilling i tilfelle unntak, men i dette tilfellet treffer vi fortsatt databasen gjentatte ganger for hver uttalelse.

3. Hvordan gjøre batchbehandling

JDBC tilbyr to klasser, Uttalelse og PreparedStatement for å utføre spørsmål i databasen. Begge klassene har sin egen implementering av addBatch () og executeBatch () metoder som gir oss batchbearbeidingsfunksjonaliteten.

3.1. Batchbehandling ved hjelp Uttalelse

Med JDBC er den enkleste måten å utføre spørsmål på en database på Uttalelse gjenstand.

Først bruker addBatch () vi kan legge til alle SQL-spørsmål i en batch og deretter utføre disse SQL-spørsmålene ved hjelp av executeBatch ().

Returtypen av executeBatch () er en int array som indikerer hvor mange poster som ble påvirket av kjøringen av hver SQL-setning.

La oss se et eksempel på å opprette og utføre en batch ved hjelp av Statement:

Uttalelsesuttalelse = connection.createStatement (); statement.addBatch ("INSERT TO A ANSTATED (ID, NAME, DESIGNATION)" + "VALUES ('1', 'EmployeeName', 'Designation')"); statement.addBatch ("INSERT IN EMP_ADDRESS (ID, EMP_ID, ADDRESS)" + "VALUES ('10', '1', 'Address')"); statement.executeBatch (); 

I eksemplet ovenfor prøver vi å sette inn poster i ANSATT og EMP_ADDRESS tabeller ved hjelp av Uttalelse. Vi kan se hvordan SQL-spørsmål blir lagt til i batchen som skal utføres.

3.2. Batchbehandling ved hjelp PreparedStatement

PreparedStatement er en annen klasse som brukes til å utføre SQL-spørringer. Det muliggjør gjenbruk av SQL-setninger og krever at vi setter nye parametere for hver oppdatering / innsats.

La oss se et eksempel med PreparedStatement. Først satte vi opp uttalelsen ved hjelp av et SQL-spørsmål kodet som en Streng:

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

Deretter løper vi gjennom en rekke String verdier og legg til et nylig konfigurert spørsmål i batchen.

Når løkken er ferdig, utfører vi batchen:

for (int i = 0; i <MEDARBEIDERE.lengde; i ++) {StrengmedarbeiderId = UUID.randomUUID (). tilString (); ansatteStmt.setString (1, ansatteId); ansatteStmt.setString (2, MEDARBEIDERE [i]); ansatteStmt.setString (3, BETEGNELSER [i]); ansatteStmt.addBatch (); } ansatteStmt.executeBatch (); 

I eksemplet vist ovenfor setter vi inn poster i ANSATT bord ved hjelp av PreparedStatement. Vi kan se hvordan verdier som skal settes inn settes i spørringen og deretter legges til batchen som skal utføres.

4. Konklusjon

I denne artikkelen så vi hvordan batchbehandling av SQL-spørsmål er viktig når vi samhandler med databaser ved hjelp av JDBC.

Som alltid kan koden relatert til denne artikkelen finnes på Github.

Java bunn

Jeg kunngjorde nettopp det nye Lær våren kurs, med fokus på det grunnleggende i vår 5 og vårstøvel 2:

>> KONTROLLER KURSET