Batchbehandling i JDBC
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 KURSET1. 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