jdbc batch processing
Denne opplæringen gir en fullstendig forståelse av JDBC Batch Processing og Java Stored Procedure med eksempler på Java-eksempler:
I JDBC Unntakshåndtering opplæring av JDBC opplæringsserie , lærte vi måter å håndtere SQL-unntak ved hjelp av programmeringseksempler.
I denne opplæringen vil vi diskutere metoder for å gjøre batchbehandling i Java ved hjelp av JDBC-driveren. Vi vil også lære om hvordan du lager lagrede prosedyrer og kaller det fra et Java-program.
La oss begynne med å forstå batchbehandling og fordelene.
Hva du vil lære:
JDBC batchbehandling
Det er prosessen med å utføre flere SQL-setninger i en transaksjon. Denne prosessen reduserer kommunikasjonstiden og øker ytelsen. Det gjør behandling av store mengder data mye enklere.
Fordeler med batchbehandling
Batch Processing tar sikte på å forbedre ytelse og datakonsistens.
Opptreden
Tenk på scenariet der flere (si 5) oppføringer skal legges til i en tabell fra et JAVA-program. Den enkle tilnærmingen vil være å åpne en forbindelse til databasen, skrive INSERT-spørsmål og utføre hvert spørsmål ved hjelp av Statement eller PreparedStatement.
Denne tilnærmingen vil øke nettverksturer til databasen, og som et resultat vil det føre til dårlig ytelse. Ved å bruke batchbehandling kan vi utføre denne operasjonen i en samtale.
Datakonsistens
I noen tilfeller må vi sette inn / oppdatere data i flere tabeller. Dette vil føre til en sammenhengende transaksjon der sekvensen av spørsmål som settes inn eller oppdateres er viktig. Eventuelle feil som oppstår under utførelsen vil føre til tilbakeføring av dataene som er satt inn av tidligere spørsmål, hvis noen.
Eksempel:
#1) Tabellen ‘EMPLOYEE_DETAILS’ har tre kolonner: ID , Navn , og Den ansattes rolle.
statement.execute('INSERT INTO EMPLOYEE_DETAILS(ID, NAME, ROLE) ' + 'VALUES ('1','EMPLOYEE_NAME1','ROLE1')');
#to) Tabellen ‘EMPLOYEE_ADDRESS’ har to kolonner: EMP ID og Adresse
statement.execute('INSERT INTO EMPLOYEE_ADDRESS( EMP_ID, ADDRESS) ' + 'VALUES ('1','ADDRESS1')');
Et problem kan oppstå i eksemplet ovenfor når den første setningen kjøres vellykket, men den andre setningen mislykkes. I denne situasjonen er det ingen tilbakeføring av dataene som er satt inn av den første uttalelsen. Dette fører til datakonsistens.
Vi kan oppnå datakonsistens ved å foreta transaksjonen på slutten eller utføre tilbakestilling i tilfelle unntak. Men for å oppnå dette, må DB treffes gjentatte ganger for hver uttalelse.
På den annen side, bare når alle spørsmålene i en batch utføres vellykket, vil batchdataene bli begått. Ellers vil det ikke.
Hvordan utføre batchbehandling
Vi kan utføre batchbehandling ved hjelp av addbatch () og executeBatch () -metodene som er tilgjengelige i både Statement- og PreparedStatement-klasser.
I denne opplæringen er alle programmene skrevet på Java. Vi har brukt Java 8-versjonen og Oracle DB.
=> Klikk her for å laste ned Oracle-programvaren
=> Klikk her for å laste ned Java versjon 8
I det følgende eksemplet vil vi se hvordan du gjør batchbehandlingen forsiktig. Den har trinnvis Java-installasjonsprosessen.
Data i ANSATTE-tabellen før du setter inn data:
hvis trafikken til et nettsted er liten, hvilken testtilnærming som fungerer best
Java-program
package com.STH.JDBC; import java.sql.BatchUpdateException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class ExecuteBatch_Example { public static void main(String() args) throws ClassNotFoundException, SQLException { //Inserting the data in EMPLOYEE Table using the following query String insert_query1 = 'insert into employee values(?,?,?)'; Class.forName('oracle.jdbc.driver.OracleDriver'); Try(Connection conn = DriverManager.getConnection('jdbc:oracle:thin:system/pass123@localhost:1521:XE')) { PreparedStatement pstatemnt1 = conn.prepareStatement(insert_query1); //Setting values for the 1st person in EMPLOYEE Table pstatemnt1.setInt(1,10001); pstatemnt1.setString(2, 'Bush'); pstatemnt1.setString(3, 'William '); //Adding the 1st insert query into batch pstatemnt1.addBatch(); //Setting values for the 2nd person in EMPLOYEE Table pstatemnt1.setInt(1,10002); pstatemnt1.setString(2, “Bush'); pstatemnt1.setString(3, 'George'); //Adding the 2nd insert query into batch pstatemnt1.addBatch(); //Setting values for the 3rd person in EMPLOYEE Table pstatemnt1.setInt(1,10003); pstatemnt1.setString(2, 'Bond'); pstatemnt1.setString(3, 'James'); //Adding the 3rd insert query into batch pstatemnt1.addBatch(); //Executing the executeBatch method int No_of_Afffected_Rows()= pstatemnt1.executeBatch(); //After inserting the data, displaying no. of rows affected System.out.println('No of rows affected = ' +No_of_Afffected_Rows.length);} catch (SQLException e) { e.printStackTrace();} } }
PRODUKSJON:
Data i ANSATTE-tabellen etter innsetting av dataene:
Forklaring:
I programmet ovenfor har vi satt inn data om 3 ansatte i en samtale ved hjelp av batchdrift.
- Opprett et innsettingsspørsmål for å overføre kolonneverdiene.
- Åpne tilkoblingen og opprett et preparertStatement-objekt ved hjelp av tilkoblingsobjektet og ring preparat-metoden.
- Still deretter inn verdiene for 1St.ansatt ved hjelp av setXXX-metoder og ring addBatch () -metoden for å legge til den nye raden i batchen.
- Slik legger du til verdiene for 2ndog 3rdansatte. Etter å ha lagt til spørsmålene i addBatch () -metoden, bør vi kalle executeBatch () -metoden ved hjelp av preparatStatement-objektet.
- metoden executeBatch () setter inn de tre ansattes data i en samtale.
- Sjekk ANSATTE-tabellen om dataene er satt inn riktig eller ikke.
Java-lagrede prosedyrer
En lagret prosedyre er en gruppe SQL-setninger som danner en enkelt enhet og utfører en bestemt oppgave. De vil bli brukt til å utføre et sett med operasjoner eller spørsmål å utføre på en databaseserver. Den kan kompileres og utføres med forskjellige parametere og resultater.
Hver prosedyre har sitt unike navn å referere til. Denne underprogramenheten er lagret som et databaseobjekt i DB.
Et underprogram er ikke annet enn en prosedyre, og det skal opprettes manuelt slik vi ønsker, og lagre det som et DB-objekt.
Lagrede prosedyrer er frittstående blokker for et program som vi kan lagre i DB. Ved å bruke navnet på den lagrede prosedyren, kan vi ringe og utføre den. Den brukes hovedsakelig til å utføre en prosess i PL / SQL. Fremgangsmåten kan ha nestede blokker eller kan være nestet i de andre blokkene.
Den lagrede prosedyren har 3 deler:
- Erklæringsdel (valgfritt): I denne delen kan vi erklære variabler, konstanter, markører osv. Det er en valgfri del. Basert på kravene kan vi bruke den.
- Utførelsesdel: Denne delen inneholder hovedforretningslogikken til prosedyren. Normalt vil den ha en blokk med SQL-setninger.
- Eksepsjonell håndteringsdel (valgfritt): I denne delen kan vi håndtere unntaket som kan oppstå på grunn av utførelsesdelkoden. Det er også valgfritt.
Basert på kravene kan vi lage en prosedyre. Vi kan sende eller hente verdiene fra parametrene.
Det er tre typer parametere tilgjengelig i lagrede prosedyrer. De er:
- I: Den brukes til å overføre inngangsverdien til den lagrede prosedyren. Den lagrede prosedyren vil bruke inngangsparameteren i programmet som en skrivebeskyttet variabel. Verdien kan ikke endres i underprogrammene. Oracle bruker IN som standardmodus for parameteren. Det er standardparameteren.
- UTE: Den brukes til å returnere eller hente verdien fra den lagrede prosedyren etter utførelsen. Det er en lese-skrive-variabel inne i underprogrammene. Verdien kan endres i underprogrammene.
- INN / UT: Den brukes til å overføre inngangsverdiene til den lagrede prosedyren og returnere eller hente verdiene fra prosedyren også. Det er både lesbart og skrivbart. Vi kan lese og endre det.
KOMME TILBAKE
Vi vil bruke returordet for å gi kontrollen tilbake til hovedprogrammet, for eksempel Java-programmet. Når prosedyren finner RETURN-nøkkelordet, vil det gå ut av kjøringen og hoppe over koden eller setningen etter det.
Hvordan ringe lagret prosedyre fra Java
Vi har et CallableStatement-grensesnitt i Java for å ringe lagret prosedyre. CallableStatement-grensesnittobjekt kan opprettes ved hjelp av prepareCall () -metoden i Connection-grensesnittet, og etter det skal vi kalle executeQuery () -metoden for å utføre den lagrede prosedyren i Java-programmet.
Før vi skriver Java-programmet for å implementere dette, bør vi lage lagrede prosedyrer for å bruke det i programmet.
Følgende er syntaksen for å ringe lagrede prosedyrer i Java-programmet:
Syntaks | Ingen parametere |
---|---|
{ring PROCEDURE_NAME ()} | Ingen inngangsparametere og ingen utgangsparametere |
{ring PROCEDURE_NAME (?,?,?)} | Tre inngangsparametere og ingen utgangsparametere |
{? = ring PROCEDURE_NAME ()} | Ingen inngangsparametere og en utgangsparameter (RETURN-verdi) |
{? = ring PROCEDURE_NAME (?,?)} | To inngangsparametere og en utgangsparameter (RETURN-verdi) |
Fremgangsmåte for å lage lagrede prosedyrer
#1) Opprett prosedyren i DB-serveren. Her bruker vi Oracle DB.
# 2) Syntaks for å lage full prosedyre:
Vi kan også skrive den lagrede prosedyren i Java-kode.
# 3) Send inn og ut parametrene for å bruke den i prosedyren.
# 4) AS / IS-nøkkelord bør nevnes. Hvis vi legger til en annen prosedyre i den nye prosedyren, bruk IS-nøkkelordet eller ellers AS-nøkkelord hvis prosedyren er frittstående.
# 5) Erklær variablene, det er ikke obligatorisk, basert på kravet vi kan opprette.
# 6) BEGYN deretter prosedyren ved å bruke BEGIN-nøkkelordet, og skriv deretter SQL-setningene eller spørsmålene som skal utføres i prosedyren.
# 7) Deretter kan vi håndtere unntaket i unntaksdelen. Det er heller ikke obligatorisk å nevne.
# 8) Avslutt prosedyren ved å nevne END-nøkkelordet og prosedyrenavnet.
Vi kan opprette prosedyren i Oracle og lagre den med et unikt navn og kalle den prosedyren fra Java-programmet. Vi kan opprette prosedyren og kalle den prosedyren også i Java.
Opprett en prosedyre i Oracle, lagre den, og ring prosedyren i Java Program.
#1) Åpne databaseserveren. Her bruker vi Oracle DB-serveren.
#to) Høyreklikk på Prosedyre-mappen og klikk på alternativet Ny prosedyre.
# 3) Den vil be om navnet på prosedyren og parameterdetaljer.
Merk: Vi kan også gi parameteropplysningene mens vi skriver prosedyren.
# 4) Skriv prosedyren ved hjelp av trinnene som vi allerede har diskutert i denne opplæringen, og lagre prosedyren med det unike navnet.
beste tekst til tale programvare gjennomgang
Fremgangsmåten i skjermbildet viser utdataene i DB. Vi kan endre den for å vise den også i Java-programmet. For det må vi bruke OUT-parametere.
# 5) Kjør prosedyren ved å klikke på Run-knappen
# 6) Skriv inn verdien i Input Value-kolonnen. Det vil vise dataene for den gitte verdien.
Til nå har vi sett hvordan du oppretter og utfører prosedyren i selve DB-konsollen.
Opprett prosedyren i DB. Ring det og vis dataene i Java-konsollen .
Lag følgende fremgangsmåte ved hjelp av trinnene ovenfor og lagre den med navnet “DISPLAY_EMPLOYEE_DETAILS”.
Java Stored Procedure Eksempel Program
package com.STH.JDBC; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; public class StoredProcedureExample { public static void main(String() args) throws ClassNotFoundException { Class.forName('oracle.jdbc.driver.OracleDriver'); //Connecting to Oracle DB Try (Connection conn = DriverManager.getConnection('jdbc:oracle:thin:system/pass123@localhost:1521:XE')) { // Creating prepared Statement CallableStatementCallStmt = conn.prepareCall('{call DISPLAY_EMPLOYEE_DETAILS(?,?,?,?)}'); //Passing Input Parameter CallStmt.setInt(1,1001); //Retrieving the Output Parameters values CallStmt.registerOutParameter(2, java.sql.Types.VARCHAR); CallStmt.registerOutParameter(3, java.sql.Types.VARCHAR); CallStmt.registerOutParameter(4, java.sql.Types.VARCHAR); //Calling the execute to execute the procedure and retrieve the data CallStmt.execute(); System.out.println('First Name: '+ CallStmt.getString(2)+'
Last Name: '+ CallStmt.getString(3) + '
Email: ' + CallStmt.getString(4)); }catch (SQLException e) { e.printStackTrace(); } } }
PRODUKSJON:
Forklaring:
I programmet ovenfor er det vi har gjort at vi har opprettet en prosedyre og lagret den i Oracle DB. Ringte deretter prosedyren ved hjelp av CallableStatement og viste dataene i Java Console.
- Opprett prosedyren og lagre den i Oracle DB.
- I Java-programmet, åpne DB-tilkoblingen og ring preparCall-metoden ved hjelp av tilkoblings- og CallableStatement-objektene.
- Gi innparameterverdien ved hjelp av metoden setXXX.
- Hent utdata-parameterverdiene ved hjelp av registerOutParameter-metoden. I denne metoden skal vi sende parameterindeksverdien og datatypen til parameteren. Verdiene lagres i parameterindeksen.
- Ved hjelp av getXXX-metodene kan vi hente dataene og vise dem i Java-konsollen.
Opprett prosedyren og kjør den i selve Java-programmet.
Java-program
package com.STH.JDBC; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Statement; public class StoredProcedureExample1 { public static void main(String() args) throws ClassNotFoundException { String Stored_Procedure = 'CREATE OR REPLACE PROCEDURE UPD_EMPLOYEE_DETAILS
' +'(
' + ' PARAM1 IN NUMBER,
' + ' PARAM2 IN NUMBER
'+ ') IS
'+ ' BEGIN
'+ 'UPDATE EMPLOYEE_DETAILS SET EMPNUM= PARAM2 WHERE EMPNUM = PARAM1;
'+ 'COMMIT;
'+ 'END UPD_EMPLOYEE_DETAILS;
'; Class.forName('oracle.jdbc.driver.OracleDriver'); //Connecting to Oracle DB try(Connection conn = DriverManager.getConnection('jdbc:oracle:thin:system/pass123@localhost:1521:XE')) {// Creating prepared Statement Statement stmt = conn.createStatement(); CallableStatementCallStmt = conn.prepareCall('{call UPD_EMPLOYEE_DETAILS(?,?)}'); stmt.execute(Stored_Procedure); //Setting the values to pass the procedure CallStmt.setInt(1,1010); CallStmt.setInt(2, 10010); //Calling executeUpdate method to update the values using Procedure CallStmt.executeUpdate(); System.out.println(' Successfully Updated ' ); } catch (SQLException e) { e.printStackTrace(); } } }
PRODUKSJON:
Data i tabellen Employee_details før utførelsen av programmet:
Data i Employee_details-tabellen etter gjennomføring av programmet:
Forklaring:
I programmet ovenfor lagrer vi prosedyrekoden som en streng.
String Stored_Procedure = 'CREATE OR REPLACE PROCEDURE UPD_EMPLOYEE_DETAILS
' +'(
' +' PARAM1 IN NUMBER,
' +' PARAM2 IN NUMBER
'+ ') IS
'+' BEGIN
'+'UPDATE EMPLOYEE_DETAILS SET EMPNUM= PARAM2 WHERE EMPNUM = PARAM1;
'+'COMMIT;
'+'END UPD_EMPLOYEE_DETAILS;
';
- Åpne Oracle DB Connection og opprett setningsobjektet ved hjelp av tilkoblingsobjektet.
- Kall createStatement-metoden ved hjelp av setningsobjekt, fordi vi oppretter prosedyren i Java-kode.
- Ring prosedyren ved hjelp av syntaksen {ring UPD_EMPLOYEE_DETAILS (?,?) for å forberede Call-metoden for CallableStatement.
- Siden vi oppretter prosedyren i Java-kode, må vi utføre den 'Opprett prosedyrekoden'.
- For å utføre denne prosedyren, ring utføringsmetoden ved å bruke utsagnsobjektet “ stmt.execute (Stored_Procedure) ”. Dette vil opprette prosedyren midlertidig i DB.
- Omfanget av prosedyren er slutten på gjennomføringen av programmet. Etter det vil den ikke være tilgjengelig. Bruk setXXX-metoder, og angi verdiene som skal oppdateres i tabellen Employee_Details.
- Ring metoden executeUpdate ved hjelp av callableStatement-objektet. Denne metoden vil oppdatere verdiene i Empoyee_Details fortellingen.
- Sjekk tabellen Employee_details om dataene er oppdatert riktig.
Poeng å huske:
- Batchbehandling forbedrer ytelsen og opprettholder datakonsistensen.
- Å utføre flere SQL-setninger i en transaksjon er kjent som batch-behandling.
- Lagret prosedyre er blokken med SQL-setninger som brukes til å utføre forretningslogikk.
- Vi kan sende inngangsparameteren ved hjelp av IN-nøkkelord til prosedyren og OUT-nøkkelordet for utdata-parameteren.
- Vi kan lage en prosedyre i selve DB-serveren og midlertidig bruke Java-kode også.
ofte stilte spørsmål
Q # 1) Hvilket grensesnitt skal brukes til å utføre batchbehandling i JDBC?
Svar: Java-pakken har Statement og PreparedStatement-grensesnitt, som gir metodene for å gjøre batchbehandling.
Spørsmål 2) Hvordan fungerer batchoppdateringer i JDBC?
Svar: En JDBC batchoppdatering er en haug med oppdateringer gruppert og sendt til databasen på en gang i stedet for å sende oppdateringene en etter en. Dermed reduserer det nettverkstrafikken i databasen.
Spørsmål 3) Hvordan øker batchbehandling ytelsen?
Svar: Batchbehandling sender dataene til databasen på en gang (bare en tur-retur) i stedet for å sende en etter en, og databasen kan kanskje utføre noen uttalelser parallelt. Slik øker det ytelsen til applikasjonen og sparer tid.
Q # 4) Hva er parametrene som er akseptert i lagrede prosedyrer i JDBC?
Svar: Det er tre typer parametere – IN, OUT og INOUT-parametere. IN-parameteren er å få inngangsverdien. OUT-parameteren er for å hente utgangsverdien. INOUT-parameteren brukes til både inngang og utgang.
Q # 5) Hva er metodene som er tilgjengelige for å utføre en lagret prosedyre i JDBC?
Svar: Ved å bruke CallableStatement Interface kan vi ringe prosedyren. CallableStatement-grensesnittet gir tre metoder for å utføre de lagrede prosedyrene.
De tre metodene er:
- executeUpdate (): Bruk denne metoden hvis prosedyren ikke returnerer noen returverdier.
- executeQuery (): Bruk denne metoden hvis prosedyren bare returnerer ett resultat.
- henrette(): Bruk denne metoden hvis prosedyren returnerer mange resultatsett eller et ukjent antall resultatsett.
Konklusjon
Vi har dekket batchbearbeiding og lagrede prosedyrer i denne opplæringen. I den moderne verden er høy ytelse, datakonsistens og gjenbrukbarhet moteordene for enhver populær applikasjon. Både batchbehandling og lagrede prosedyrer spiller en veldig viktig rolle i implementeringen av disse funksjonene. Kunnskap om disse er uunngåelig for enhver programvareingeniør.
Anbefalt lesing
- Java JDBC Tutorial: Hva er JDBC (Java Database Connectivity)
- Java JDBC-tilkoblingsveiledning med programmeringseksempel
- Java JDBC-transaksjonsstyring med eksempel
- JDBC ResultSet: Hvordan bruke Java ResultSet for å hente data
- JDBC Unntakshåndtering - Hvordan håndtere SQL-unntak
- JDBC DriverManager, JDBC PreparedStatement And Statement
- JAVA-opplæring for nybegynnere: 100+ praktiske Java-videoveiledninger