jdbc batch processing
Aquest tutorial proporciona una comprensió completa del processament per lots de JDBC i del procediment emmagatzemat de Java amb exemples de Java de mostra:
A la Gestió d'excepcions JDBC tutorial del Sèrie de tutorials JDBC , hem après maneres de gestionar les excepcions SQL amb l'ajut d'exemples de programació.
En aquest tutorial, parlarem de mètodes per fer processament per lots en Java mitjançant el controlador JDBC. També aprendrem sobre com crear procediments emmagatzemats i anomenar-los des d’un programa Java.
Comencem per entendre el processament per lots i els seus avantatges.
Què aprendreu:
Processament per lots de JDBC
És el procés d'execució de diverses sentències SQL en una transacció. Aquest procés redueix el temps de comunicació i augmenta el rendiment. Facilita molt el processament d’una gran quantitat de dades.
Avantatges del processament per lots
El processament per lots té com a objectiu millorar el rendiment i la consistència de les dades.
Rendiment
Penseu en l’escenari en què s’han d’afegir diverses entrades (per exemple, 5) a una taula d’un programa JAVA. L’enfocament senzill serà obrir una connexió a la base de dades, escriure consultes INSERT i executar cada consulta mitjançant Statement o PreparedStatement.
Aquest enfocament augmentarà els viatges en xarxa a la base de dades i, com a resultat, comportarà un rendiment baix. Mitjançant el processament per lots, podem realitzar aquesta operació en una sola trucada.
Coherència de dades
En alguns casos, hem d’inserir / actualitzar dades en diverses taules. Això conduirà a una transacció interrelacionada en què la seqüència de consultes que s’insereixi o s’actualitzi és important. Qualsevol error que es produeixi durant l'execució donaria lloc a una recuperació de les dades inserides per consultes anteriors, si n'hi hagués.
Exemple:
# 1) La taula 'EMPLOYEE_DETAILS' té 3 columnes: Identificació , Nom , i Paper de l’empleat.
statement.execute('INSERT INTO EMPLOYEE_DETAILS(ID, NAME, ROLE) ' + 'VALUES ('1','EMPLOYEE_NAME1','ROLE1')');
# 2) La taula 'EMPLOYEE_ADDRESS' té 2 columnes: Identificador EMP i adreça
statement.execute('INSERT INTO EMPLOYEE_ADDRESS( EMP_ID, ADDRESS) ' + 'VALUES ('1','ADDRESS1')');
Es pot produir un problema a l'exemple anterior quan la primera sentència s'executa correctament, però la segona sentència falla. En aquesta situació, no hi ha cap reversió de les dades inserides per la primera sentència. Això comporta incoherències de dades.
Podem aconseguir la coherència de les dades realitzant la transacció al final o realitzant una reversió en cas d’excepcions. Però, per aconseguir-ho, s'ha de colpejar la base de dades repetidament per a cada afirmació.
D'altra banda, en el processament per lots, només quan totes les consultes dins d'un lot s'executin correctament, es comprometran les dades. En cas contrari, no ho farà.
Com es realitza el processament per lots
Podem realitzar el processament per lots mitjançant els mètodes addbatch () i executeBatch () que estan disponibles a les classes Statement i PreparedStatement.
En aquest tutorial, tots els programes estan escrits en Java. Hem utilitzat la versió Java 8 i Oracle DB.
=> Feu clic aquí per descarregar el programari Oracle
=> Feu clic aquí per descarregar la versió 8 de Java
A l'exemple següent, veurem com fer el processament per lots de manera elaborada. Té el procés d’instal·lació de Java pas a pas.
Dades de la taula EMPLOYEE abans d’inserir dades:
quin és el millor bloquejador d'anuncis per a Chrome
Programa 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();} } }
SORTIDA:
Dades a la taula EMPLOYEE després de la inserció de les dades:
Explicació:
Al programa anterior, hem inserit dades de 3 empleats en una trucada mitjançant una operació per lots.
- Creeu una consulta d'inserció per passar els valors de les columnes.
- Obriu la connexió i creeu un objecte preparatStatement mitjançant l’objecte de connexió i truqueu al mètode prepareStatement.
- A continuació, definiu els valors de l'1cempleat mitjançant mètodes setXXX i truqueu al mètode addBatch () per afegir la nova fila al lot.
- Així, afegiu els valors de 2ndi 3rdempleats. Després d'afegir les consultes al mètode addBatch (), hauríem de trucar al mètode executeBatch () mitjançant l'objecte prepareStatement.
- El mètode executeBatch () insereix les dades dels 3 empleats en una trucada.
- Comproveu la taula EMPLOYEE si les dades s’han inserit correctament o no.
Procediments emmagatzemats de Java
Un procediment emmagatzemat és un grup d’instruccions SQL que formen una sola unitat i realitzen una tasca específica. S'utilitzaran per realitzar un conjunt d'operacions o preguntes per executar en un servidor de bases de dades. Es pot compilar i executar amb diferents paràmetres i resultats.
Cada procediment té el seu nom únic per referir-se. Aquesta unitat de subprograma s'emmagatzema com a objecte de base de dades a la base de dades.
Un subprograma no és més que un procediment i s’ha de crear manualment com vulguem i emmagatzemar-lo com a objecte de base de dades.
Els procediments emmagatzemats són blocs independents d’un programa que podem emmagatzemar a la base de dades. Mitjançant el nom del procediment emmagatzemat, podem trucar-lo i executar-lo. S'utilitza principalment per executar un procés en PL / SQL. El procediment pot tenir blocs niats o bé es pot niar dins dels altres blocs.
El procediment emmagatzemat té tres parts:
- Part de la declaració (opcional): En aquesta part, podem declarar les variables, constants, cursors, etc., és una part opcional. En funció dels requisits, el podem utilitzar.
- Part d'execució: Aquesta part conté la principal lògica empresarial del procediment. Normalment tindrà un bloc d’instruccions SQL.
- Part de manipulació excepcional (opcional): En aquesta part, podem gestionar l'excepció que es pot produir a causa del codi de la peça d'execució. També és opcional.
Basant-nos en els requisits, podem crear un procediment. Podem passar o recuperar els valors dels paràmetres.
Hi ha tres tipus de paràmetres disponibles als procediments emmagatzemats. Ells són:
- A: S'utilitza per passar el valor d'entrada al procediment emmagatzemat. El procediment emmagatzemat farà servir el paràmetre d'entrada del programa com a variable de només lectura. El valor no es pot canviar dins dels subprogrames. Oracle utilitza IN com a mode per defecte del paràmetre. És el paràmetre per defecte.
- Fora: S'utilitza per retornar o obtenir el valor del procediment emmagatzemat després de l'execució. És una variable de lectura-escriptura dins dels subprogrames. El valor es pot canviar dins dels subprogrames.
- DINS FORA: S'utilitza per passar els valors d'entrada al procediment emmagatzemat i retornar o obtenir els valors del procediment també. Es pot llegir i escriure. El podem llegir i modificar.
TORNAR
Utilitzarem la paraula clau return per retornar el control al programa principal, com ara el programa Java. Quan el procediment troba la paraula clau RETURN, sortirà de l'execució i saltarà el codi o la sentència després d'ella.
Com trucar al procediment emmagatzemat des de Java
Tenim una interfície CallableStatement a Java per trucar a Procediment emmagatzemat. L'objecte d'interfície CallableStatement es pot crear utilitzant el mètode prepareCall () de la interfície Connection i, després d'això, hauríem de trucar al mètode executeQuery () per executar el programa Stored Procedure a Java.
Abans d’escriure el programa Java per implementar-lo, hauríem de crear procediments emmagatzemats per utilitzar-lo al programa.
A continuació es mostra la sintaxi per cridar als procediments emmagatzemats al programa Java:
Sintaxi | Nombre de paràmetres |
---|---|
{trucar a PROCEDURE_NAME ()} | Sense paràmetres d'entrada ni paràmetres de sortida |
{trucar a PROCEDURE_NAME (?,?,?)} | Tres paràmetres d'entrada i cap paràmetre de sortida |
{? = truca a PROCEDURE_NAME ()} | No hi ha paràmetres d'entrada i un paràmetre de sortida (valor RETURN) |
{? = truca a PROCEDURE_NAME (?,?)} | Dos paràmetres d'entrada i un paràmetre de sortida (valor RETURN) |
Passos per crear procediments emmagatzemats
# 1) Creeu el procediment al servidor de la base de dades. Aquí estem utilitzant Oracle DB.
# 2) Sintaxi per crear el procediment complet:
També podem escriure el procediment emmagatzemat en codi Java.
# 3) Passeu els paràmetres IN i OUT per utilitzar-lo al procediment.
# 4) Cal esmentar la paraula clau AS / IS. Si afegim un altre procediment al nou procediment, utilitzeu la paraula clau IS o bé la paraula clau AS si el procediment és independent.
# 5) Declareu les variables, no és obligatori, segons el requisit que puguem crear.
# 6) A continuació, COMENÇEU el procediment mitjançant la paraula clau BEGIN i, a continuació, escriviu les instruccions o consultes SQL que es realitzaran al procediment.
# 7) A continuació, podem gestionar l'excepció a la part Excepció. Tampoc no és obligatori esmentar-ho.
# 8) Finalitzeu el procediment esmentant la paraula clau END i el nom del procediment.
Podem crear el procediment a Oracle i desar-lo amb un nom únic i anomenar-lo des del programa Java. Podem crear el procediment i anomenar-lo també a Java.
Creeu un procediment a Oracle, deseu-lo i truqueu-lo al programa Java.
# 1) Obriu el servidor de base de dades. Aquí estem utilitzant el servidor Oracle DB.
# 2) Feu clic amb el botó dret a la carpeta Procediment i feu clic a l'opció Procediment nou.
# 3) Sol·licitarà el nom del procediment i els detalls dels paràmetres.
quina és la meva clau de seguretat a Internet
Nota: Podem donar els detalls dels paràmetres mentre escrivim el procediment.
# 4) Escriviu el procediment seguint els passos que ja hem comentat en aquest tutorial i deseu el procediment amb el nom únic.
El procediment de la captura de pantalla mostrarà la sortida a la base de dades. El podem canviar per mostrar-lo també al programa Java. Per a això, hem d’utilitzar paràmetres OUT.
# 5) Executeu el procediment fent clic al botó d'execució
# 6) Introduïu el valor a la columna Valor d'entrada. Es mostraran les dades del valor donat.
Fins ara hem vist com crear i executar el procediment a la pròpia consola de base de dades.
Creeu el procediment a la base de dades. Truqueu-lo i mostreu les dades a la consola Java .
Creeu el següent procediment seguint els passos anteriors i deseu-lo amb el nom 'DISPLAY_EMPLOYEE_DETAILS'.
Programa d’exemple de procediment emmagatzemat de 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; 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(); } } }
SORTIDA:
Explicació:
Al programa anterior, el que hem fet és que hem creat un procediment i l'hem desat a Oracle DB. A continuació, es va trucar a aquest procediment mitjançant CallableStatement i va mostrar les dades a la consola Java.
- Creeu el procediment i deseu-lo a Oracle DB.
- Al programa Java, obriu la connexió de base de dades i truqueu al mètode prepareCall mitjançant la connexió i els objectes CallableStatement.
- Passeu el valor del paràmetre d'entrada mitjançant el mètode setXXX.
- Recupereu els valors dels paràmetres de sortida mitjançant el mètode registerOutParameter. En aquest mètode, hauríem de passar el valor de l’índex del paràmetre i el tipus de dades del paràmetre. Emmagatzemarà els valors a l'índex de paràmetres.
- Mitjançant els mètodes getXXX, podem recuperar les dades i mostrar-les a la consola Java.
Creeu el procediment i executeu-lo al propi programa Java.
Programa 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(); } } }
SORTIDA:
Dades de la taula Employee_details abans de l'execució del programa:
Dades de la taula Employee_details després de l'execució del programa:
Explicació:
Al programa anterior, emmagatzemem el codi del procediment com una cadena.
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;
';
- Obriu l'Oracle DB Connection i creeu l'objecte de declaració mitjançant l'objecte de connexió.
- Truqueu al mètode createStatement mitjançant l’objecte statement perquè creem el procediment en codi Java.
- Truqueu al procediment mitjançant la sintaxi {trucar a UPD_EMPLOYEE_DETAILS (?,?) per preparar el mètode CallableStatement.
- Com que estem creant el procediment en codi Java, hem d'executar aquest 'Crea un codi de procediment'.
- Per executar aquest procediment, truqueu al mètode execute mitjançant l'objecte Statement ' stmt.execute (procediment_magatzemat) ”. Això crearà el procediment temporalment a la base de dades.
- L’abast del procediment és el final de l’execució del programa. Després, no estarà disponible. Amb els mètodes setXXX, definiu els valors que cal actualitzar a la taula Employee_Details.
- Truqueu al mètode executeUpdate mitjançant l’objecte callableStatement. Aquest mètode actualitzarà els valors del conte Empoyee_Details.
- Comproveu la taula Employee_details si les dades s’han actualitzat correctament.
Punts per recordar:
- El processament per lots millora el rendiment i manté la coherència de les dades.
- L’execució de diverses sentències SQL en una transacció es coneix com a processament per lots.
- El procediment emmagatzemat és el bloc d’instruccions SQL que s’utilitza per realitzar la lògica empresarial.
- Podem passar el paràmetre d’entrada mitjançant la paraula clau IN al procediment i la paraula OUT del paràmetre de sortida.
- Podem crear un procediment al propi servidor de base de dades i també mitjançant codi Java.
Preguntes freqüents
P # 1) Quina interfície s'ha d'utilitzar per realitzar el processament per lots a JDBC?
Resposta: El paquet Java té interfícies Statement i PreparedStatement, que proporcionen els mètodes per fer el processament per lots.
Q # 2) Com funcionen les actualitzacions per lots a JDBC?
Resposta: Una actualització per lots de JDBC és un conjunt d'actualitzacions agrupades i enviades a la base de dades d'una sola vegada en lloc d'enviar les actualitzacions una per una. Per tant, redueix el trànsit de xarxa a la base de dades.
P # 3) Com augmenta el rendiment el processament per lots?
Resposta: El processament per lots envia les dades a la base de dades alhora (només un viatge d'anada i tornada) en lloc d'enviar-les d'una en una, i és possible que la base de dades pugui executar algunes sentències en paral·lel. Així, augmenta el rendiment de l’aplicació i estalvia temps.
Q # 4) Quins són els paràmetres acceptats als procediments emmagatzemats a JDBC?
Resposta: Hi ha tres tipus de paràmetres: paràmetres IN, OUT i INOUT. El paràmetre IN és obtenir el valor d’entrada. El paràmetre OUT permet recuperar el valor de sortida. El paràmetre INOUT s'utilitza tant per a l'entrada com per a la sortida.
P # 5) Quins són els mètodes disponibles per executar un procediment emmagatzemat a JDBC?
Resposta: Mitjançant la interfície CallableStatement, podem trucar al procediment. La interfície CallableStatement proporciona tres mètodes per executar els procediments emmagatzemats.
Els tres mètodes són:
- executeUpdate (): Utilitzeu aquest mètode si el procediment no retorna cap valor de retorn.
- executeQuery (): Utilitzeu aquest mètode si el procediment només retorna un conjunt de resultats.
- execute (): Utilitzeu aquest mètode si el procediment retorna molts conjunts de resultats o un nombre desconegut de conjunts de resultats.
Conclusió
En aquest tutorial hem tractat el processament per lots i els procediments emmagatzemats. Al món modern, l’alt rendiment, la consistència de les dades i la reutilització són les paraules clau per a qualsevol aplicació popular. Tant el processament per lots com els procediments emmagatzemats tenen un paper molt important en la implementació d’aquestes funcions. El coneixement d’aquests és inevitable per a tots els enginyers de programari.
Lectura recomanada
- Tutorial Java JDBC: què és JDBC (connectivitat a la base de dades Java)
- Tutorial de connexió Java JDBC amb exemple de programació
- Gestió de transaccions Java JDBC amb exemple
- JDBC ResultSet: Com utilitzar Java ResultSet per recuperar dades
- Gestió d’excepcions de JDBC: com gestionar les excepcions d’SQL
- JDBC DriverManager, JDBC PreparedStatement i declaració
- Tutorial JAVA per a principiants: més de 100 tutorials pràctics de vídeo Java