jdbc batch processing
Acest tutorial oferă o înțelegere completă a procesării prin loturi JDBC și a procedurii stocate Java, cu exemple de exemple Java:
În JDBC Exception Handling tutorial de Seria de tutoriale JDBC , am învățat modalități de a gestiona excepțiile SQL cu ajutorul exemplelor de programare.
În acest tutorial, vom discuta despre metodele de efectuare a procesării batch în Java folosind driverul JDBC. De asemenea, vom învăța despre cum să creăm proceduri stocate și să o apelăm dintr-un program Java.
Să începem cu înțelegerea procesării în serie și a avantajelor sale.
Ce veți învăța:
Procesare în lot JDBC
Este procesul de executare a mai multor instrucțiuni SQL într-o singură tranzacție. Acest proces reduce timpul de comunicare și crește performanța. Face procesarea unei cantități mari de date mult mai ușoară.
Avantajele procesării în serie
Procesarea în lot are ca scop îmbunătățirea performanței și a consistenței datelor.
Performanţă
Luați în considerare scenariul în care mai multe (de exemplu, 5) intrări trebuie adăugate la un tabel dintr-un program JAVA. Abordarea simplă va fi deschiderea unei conexiuni la baza de date, scrierea interogărilor INSERT și executarea fiecărei interogări folosind Declarație sau PreparedStatement.
Această abordare va crește călătoriile în rețea către baza de date și, prin urmare, va duce la performanțe slabe. Folosind procesarea în lot, putem efectua această operațiune într-un singur apel.
Coerența datelor
În unele cazuri, trebuie să inserăm / actualizăm date în mai multe tabele. Acest lucru va duce la o tranzacție interdependentă în care secvența de interogări care este inserată sau actualizată este importantă. Orice erori care apar în timpul execuției ar duce la o revenire a datelor inserate de interogările anterioare, dacă există.
Exemplu:
# 1) Tabelul „EMPLOYEE_DETAILS” are 3 coloane: ID , Nume , și Rolul angajatului.
statement.execute('INSERT INTO EMPLOYEE_DETAILS(ID, NAME, ROLE) ' + 'VALUES ('1','EMPLOYEE_NAME1','ROLE1')');
#Două) Tabelul „EMPLOYEE_ADDRESS” are 2 coloane: ID EMP și Abordare
statement.execute('INSERT INTO EMPLOYEE_ADDRESS( EMP_ID, ADDRESS) ' + 'VALUES ('1','ADDRESS1')');
O problemă poate apărea în exemplul de mai sus atunci când prima instrucțiune se execută cu succes, dar a doua instrucțiune eșuează. În această situație, nu există o revenire a datelor inserate de prima declarație. Acest lucru duce la neconcordanță a datelor.
Putem obține coerența datelor prin efectuarea tranzacției la final sau efectuarea unei restituiri în cazul unor excepții. Dar, pentru a realiza acest lucru, DB trebuie să fie lovit în mod repetat pentru fiecare afirmație.
Pe de altă parte, în procesarea lotului, numai atunci când toate interogările din interiorul unui lot se execută cu succes, datele vor fi angajate. În caz contrar, nu va fi.
Cum să efectuați procesarea în lot
Putem efectua procesarea batch folosind metodele addbatch () și executeBatch () care sunt disponibile atât în clasele Declarație, cât și în PreparedStatement.
În acest tutorial, toate programele sunt scrise în Java. Am folosit versiunea Java 8 și Oracle DB.
=> Faceți clic aici pentru a descărca software-ul Oracle
=> Faceți clic aici pentru a descărca versiunea Java 8
În exemplul următor, vom vedea cum să facem procesarea batch în mod elaborat. Are procesul de instalare pas cu pas Java.
Date din tabelul ANGAJAT înainte de a insera date:
când un element individual al unui tablou este trecut la o metodă:
Program Java
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();} } }
IEȘIRE:
Date în tabelul ANGAJAT după inserarea datelor:
Explicaţie:
În programul de mai sus, am inserat date de 3 angajați într-un singur apel folosind operația de lot.
- Creați o singură interogare de inserare pentru a transmite valorile coloanei.
- Deschideți conexiunea și creați un obiect preparatStatement folosind obiectul conexiune și apelați metoda prepareStatement.
- Apoi setați valorile pentru 1Sfangajat folosind metode setXXX și apelați metoda addBatch () pentru a adăuga noul rând în lot.
- În acest fel, adăugați valorile pentru 2ndși 3rdangajați. După adăugarea interogărilor în metoda addBatch (), ar trebui să apelăm metoda executeBatch () folosind obiectul pregătitStatement.
- metoda executeBatch () introduce datele celor 3 angajați într-un singur apel.
- Verificați tabelul ANGAJAT dacă datele au fost inserate corect sau nu.
Proceduri stocate în Java
O procedură stocată este un grup de instrucțiuni SQL care formează o singură unitate și efectuează o sarcină specifică. Acestea vor fi utilizate pentru a efectua un set de operații sau întrebări de executat pe un server de baze de date. Poate fi compilat și executat cu diferiți parametri și rezultate.
Fiecare procedură are numele său unic pentru a fi menționat. Această unitate de subprogram este stocată ca obiect de bază de date în DB.
Un subprogram nu este altceva decât o procedură și ar trebui să fie creat manual așa cum dorim și să-l stocăm ca obiect DB.
Procedurile stocate sunt blocuri independente ale unui program pe care le putem stoca în DB. Folosind numele procedurii stocate, îl putem apela și executa. Este utilizat în principal pentru a executa un proces în PL / SQL. Procedura poate avea blocuri imbricate sau poate fi imbricată în interiorul celorlalte blocuri.
Procedura stocată are 3 părți:
- Declarație (opțional): În această parte, putem declara variabilele, constantele, cursorii etc., Este o parte opțională. Pe baza cerințelor, îl putem folosi.
- Partea de executare: Această parte conține principala logică de afaceri a procedurii. În mod normal, va avea un bloc de instrucțiuni SQL.
- Piesa de manipulare excepțională (opțional): În această parte, putem gestiona excepția care poate apărea din cauza codului piesei Execution. De asemenea, este opțional.
Pe baza cerințelor, putem crea o procedură. Putem trece sau prelua valorile din parametri.
Există trei tipuri de parametri disponibili în procedurile stocate. Sunt:
- ÎN: Se folosește pentru a transmite valoarea de intrare procedurii stocate. Procedura stocată va utiliza parametrul de intrare în program ca o variabilă numai în citire. Valoarea nu poate fi modificată în interiorul subprogramelor. Oracle folosește IN ca mod implicit al parametrului. Este parametrul implicit.
- OUT: Este folosit pentru a returna sau a obține valoarea din Procedura stocată după executare. Este o variabilă de citire-scriere din interiorul subprogramelor. Valoarea poate fi modificată în interiorul subprogramelor.
- ÎN AFARĂ: Se folosește pentru a transmite valorile de intrare către procedura stocată și pentru a returna sau a obține valorile din procedură. Este atât citibil, cât și înscris. Îl putem citi și modifica.
ÎNTOARCERE
Vom folosi cuvântul cheie return pentru a reda controlul programului principal, cum ar fi programul Java. Când procedura găsește cuvântul cheie RETURN, acesta va ieși din execuție și va sări peste cod sau instrucțiune după acesta.
Cum să apelați procedura stocată din Java
Avem o interfață CallableStatement în Java pentru a apela procedura stocată. Obiectul interfeței CallableStatement poate fi creat folosind metoda prepareCall () a interfeței Connection și, după aceea, ar trebui să apelăm metoda executeQuery () pentru a executa procedura stocată în programul Java.
Înainte de a scrie programul Java pentru a implementa acest lucru, ar trebui să creăm proceduri stocate pentru a-l utiliza în program.
Următoarea este sintaxa pentru apelarea procedurilor stocate în programul Java:
Sintaxă | Nr de parametri |
---|---|
{apel PROCEDURA_NAME ()} | Fără parametri de intrare și fără parametri de ieșire |
{apel PROCEDURE_NAME (?,?,?)} | Trei parametri de intrare și fără parametri de ieșire |
{? = sunați la PROCEDURE_NAME ()} | Nu există parametri de intrare și un parametru de ieșire (valoare RETURN) |
{? = sunați la PROCEDURE_NAME (?,?)} | Doi parametri de intrare și un parametru de ieșire (valoare RETURN) |
Pași pentru a crea proceduri stocate
# 1) Creați procedura în serverul DB. Aici folosim Oracle DB.
# 2) Sintaxa pentru crearea procedurii complete:
Putem scrie procedura stocată și în cod Java.
# 3) Treceți parametrii IN și OUT pentru a-i utiliza în procedură.
# 4) Trebuie menționat cuvântul cheie AS / IS. Dacă adăugăm o altă procedură în noua procedură, utilizați cuvântul cheie IS sau altfel cuvânt cheie AS dacă procedura este independentă.
# 5) Declarați variabilele, nu este obligatoriu, pe baza cerinței pe care o putem crea.
# 6) Apoi ÎNCEPE procedura utilizând cuvântul cheie BEGIN și apoi scrie instrucțiunile SQL sau interogările care trebuie efectuate în procedură.
# 7) Apoi, putem gestiona excepția din partea Excepție. De asemenea, nu este obligatoriu să menționăm.
# 8) Încheiați procedura menționând cuvântul cheie END și numele procedurii.
Putem crea procedura în Oracle și o putem salva cu un nume unic și putem apela această procedură din programul Java. Putem crea procedura și o putem apela și în Java.
Creați o procedură în Oracle, salvați-o și apelați procedura în Programul Java.
# 1) Deschideți serverul de baze de date. Aici folosim serverul Oracle DB.
#Două) Faceți clic dreapta pe folderul Procedură și faceți clic pe opțiunea Procedură nouă.
# 3) Acesta va cere numele procedurii și detaliile parametrilor.
Notă: Putem oferi detaliile parametrului în timp ce scriem procedura.
# 4) Scrieți procedura folosind pașii pe care i-am discutat deja în acest tutorial și salvați procedura cu numele unic.
Procedura din captura de ecran va afișa ieșirea în DB. Îl putem schimba pentru a-l afișa și în programul Java. Pentru aceasta, trebuie să folosim parametrii OUT.
# 5) Rulați procedura făcând clic pe butonul Executare
# 6) Introduceți valoarea în coloana Valoare de intrare. Va afișa datele pentru valoarea dată.
Până acum, am văzut cum să creăm și să executăm procedura chiar în consola DB.
Creați procedura în DB. Apelați-l și afișați datele în consola Java .
Creați următoarea procedură utilizând pașii de mai sus și salvați-o cu numele „DISPLAY_EMPLOYEE_DETAILS”.
Program Java Exemplu de procedură stocată
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(); } } }
IEȘIRE:
Explicaţie:
În programul de mai sus, ceea ce am făcut este că am creat o procedură și am salvat-o în Oracle DB. Apoi a apelat acea procedură folosind CallableStatement și a afișat datele în Java Console.
- Creați procedura și salvați-o în Oracle DB.
- În programul Java, deschideți conexiunea DB și apelați metoda prepareCall folosind conexiunea și obiectele CallableStatement.
- Treceți valoarea parametrului de intrare folosind metoda setXXX.
- Recuperați valorile parametrilor de ieșire utilizând metoda registerOutParameter. În această metodă, ar trebui să trecem valoarea indexului parametrului și tipul de date al parametrului. Va stoca valorile în indexul parametrilor.
- Folosind metodele getXXX, putem prelua datele și le putem afișa în consola Java.
Creați procedura și executați-o chiar în programul Java.
companii care vă plătesc pentru a încerca produsele lor
Program Java
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(); } } }
IEȘIRE:
Date din tabelul Employee_details înainte de executarea programului:
Date din tabelul Employee_details după executarea programului:
Explicaţie:
În programul de mai sus, stocăm codul procedurii ca un șir.
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;
';
- Deschideți Oracle DB Connection și creați obiectul declarație folosind obiectul de conexiune.
- Apelați metoda createStatement folosind obiectul declarație, deoarece creăm procedura în cod Java.
- Apelați procedura utilizând sintaxa {apel UPD_EMPLOYEE_DETAILS (?,?) to prepareCall metoda CallableStatement.
- Deoarece creăm procedura în cod Java, trebuie să executăm acel „Creare cod procedură”.
- Pentru a executa acea procedură, apelați metoda execute folosind obiectul Declarație „ stmt.execute (Stored_Procedure) ”. Aceasta va crea procedura temporar în DB.
- Scopul procedurii este sfârșitul execuției programului. După aceea, nu va mai fi disponibil. Folosind metodele setXXX, setați valorile de actualizat în tabelul Employee_Details.
- Apelați metoda executeUpdate folosind obiectul callableStatement. Această metodă va actualiza valorile din povestea Empoyee_Details.
- Verificați tabelul Employee_details dacă datele au fost actualizate corect.
Puncte de reținut:
- Procesarea în serie îmbunătățește performanța și menține coerența datelor.
- Executarea mai multor instrucțiuni SQL într-o singură tranzacție este cunoscută sub numele de procesare batch.
- Procedura stocată este blocul de instrucțiuni SQL utilizate pentru a efectua logica de afaceri.
- Putem trece parametrul de intrare folosind cuvântul cheie IN la procedură și cuvântul cheie OUT pentru parametrul de ieșire.
- Putem crea o procedură în propriul server DB și temporar folosind și codul Java.
întrebări frecvente
Q # 1) Care interfață ar trebui să fie utilizată pentru a efectua procesarea batch în JDBC?
Răspuns: Pachetul Java are interfețe Statement și PreparedStatement, care furnizează metodele de procesare batch.
Q # 2) Cum funcționează actualizările de lot în JDBC?
Răspuns: O actualizare batch JDBC este o grămadă de actualizări grupate și trimise la baza de date dintr-o singură dată, mai degrabă decât trimiterea actualizărilor una câte una. Astfel, reduce traficul de rețea din baza de date.
Î # 3) Cum crește performanța procesării în lot?
Răspuns: Procesarea în lot trimite datele către baza de date simultan (doar o călătorie dus-întors), mai degrabă decât trimiterea una câte una, iar baza de date ar putea să execute unele instrucțiuni în paralel. Astfel, crește performanța aplicației și economisește timp.
Q # 4) Care sunt parametrii acceptați în procedurile stocate în JDBC?
Răspuns: Există trei tipuri de parametri: parametrii IN, OUT și INOUT. Parametrul IN este de a obține valoarea de intrare. Parametrul OUT este pentru recuperarea valorii de ieșire. Parametrul INOUT este utilizat atât pentru intrare, cât și pentru ieșire.
Q # 5) Care sunt metodele disponibile pentru a executa o procedură stocată în JDBC?
Răspuns: Folosind CallableStatement Interface, putem apela procedura. Interfața CallableStatement oferă trei metode pentru a executa procedurile stocate.
Cele trei metode sunt:
- executeUpdate (): Utilizați această metodă dacă procedura nu returnează nicio valoare de returnare.
- executeQuery (): Utilizați această metodă dacă procedura returnează un singur set de rezultate.
- a executa(): Utilizați această metodă dacă procedura returnează multe seturi de rezultate sau un număr necunoscut de seturi de rezultate.
Concluzie
Am acoperit procesarea pe loturi și procedurile stocate în acest tutorial. În lumea modernă, performanța ridicată, consistența datelor și reutilizarea sunt cuvintele cheie pentru orice aplicație populară. Atât procesarea în lot, cât și procedurile stocate joacă un rol foarte important în implementarea acestor caracteristici. Cunoașterea acestora este inevitabilă pentru fiecare inginer software.
Lectură recomandată
- Tutorial Java JDBC: Ce este JDBC (Java Database Connectivity)
- Tutorial de conexiune Java JDBC cu exemplu de programare
- Gestionarea tranzacțiilor Java JDBC cu exemplu
- JDBC ResultSet: Cum se utilizează Java ResultSet pentru a prelua date
- JDBC Exception Handling - Cum să gestionați excepțiile SQL
- JDBC DriverManager, JDBC PreparedStatement și declarație
- Tutorial JAVA pentru începători: peste 100 de cursuri video Java practice