jdbc batch processing
Questo tutorial fornisce una comprensione completa dell'elaborazione batch JDBC e della procedura memorizzata Java con esempi Java di esempio:
Nel Gestione delle eccezioni JDBC tutorial di Serie di tutorial JDBC , abbiamo imparato come gestire le eccezioni SQL con l'aiuto di esempi di programmazione.
In questo tutorial, discuteremo i metodi per eseguire l'elaborazione batch in Java utilizzando il driver JDBC. Impareremo anche come creare procedure memorizzate e come chiamarle da un programma Java.
Cominciamo con la comprensione dell'elaborazione batch e dei suoi vantaggi.
Cosa imparerai:
Elaborazione batch JDBC
È il processo di esecuzione di più istruzioni SQL in una transazione. Questo processo riduce i tempi di comunicazione e aumenta le prestazioni. Rende molto più semplice l'elaborazione di una grande quantità di dati.
Vantaggi dell'elaborazione in batch
L'elaborazione in batch mira a migliorare le prestazioni e la coerenza dei dati.
Prestazione
Considera lo scenario in cui più (diciamo 5) voci devono essere aggiunte a una tabella da un programma JAVA. L'approccio diretto sarà l'apertura di una connessione al database, la scrittura di query INSERT e l'esecuzione di ciascuna query utilizzando Statement o PreparedStatement.
Questo approccio aumenterà i viaggi di rete nel database e, di conseguenza, porterà a prestazioni scadenti. Utilizzando l'elaborazione batch, possiamo eseguire questa operazione in una chiamata.
Coerenza dei dati
In alcuni casi, è necessario inserire / aggiornare i dati in più tabelle. Ciò porterà a una transazione correlata in cui la sequenza di query da inserire o aggiornare è importante. Eventuali errori che si verificano durante l'esecuzione comporterebbero un rollback dei dati inseriti dalle query precedenti, se presenti.
Esempio:
# 1) La tabella 'EMPLOYEE_DETAILS' ha 3 colonne: ID , Nome , e Ruolo del dipendente.
statement.execute('INSERT INTO EMPLOYEE_DETAILS(ID, NAME, ROLE) ' + 'VALUES ('1','EMPLOYEE_NAME1','ROLE1')');
#Due) La tabella 'EMPLOYEE_ADDRESS' ha 2 colonne: ID EMP e Indirizzo
statement.execute('INSERT INTO EMPLOYEE_ADDRESS( EMP_ID, ADDRESS) ' + 'VALUES ('1','ADDRESS1')');
Un problema può verificarsi nell'esempio precedente quando la prima istruzione viene eseguita correttamente, ma la seconda istruzione non riesce. In questa situazione, non c'è alcun rollback dei dati inseriti dalla prima istruzione. Ciò porta a incoerenza dei dati.
Possiamo ottenere la coerenza dei dati eseguendo il commit della transazione alla fine o eseguendo un rollback in caso di eccezioni. Ma, per ottenere ciò, il DB deve essere premuto ripetutamente per ogni istruzione.
D'altra parte, nell'elaborazione batch, solo quando tutte le query all'interno di un batch vengono eseguite correttamente, i dati verranno salvati. Altrimenti, non lo farà.
Come eseguire l'elaborazione in batch
Possiamo eseguire l'elaborazione in batch utilizzando i metodi addbatch () ed executeBatch () disponibili nelle classi Statement e PreparedStatement.
In questo tutorial, tutti i programmi sono scritti in Java. Abbiamo utilizzato la versione Java 8 e Oracle DB.
=> Fare clic qui per scaricare il software Oracle
=> Fare clic qui per scaricare la versione 8 di Java
Nell'esempio seguente, vedremo come eseguire l'elaborazione batch in modo elaborato. Ha il processo di installazione Java passo dopo passo.
Dati nella tabella EMPLOYEE prima di inserire i dati:
differenza tra ripetizione del test e test di regressione
Programma 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();} } }
PRODUZIONE:
Dati nella tabella DIPENDENTE dopo l'inserimento dei dati:
Spiegazione:
Nel programma sopra, abbiamo inserito i dati di 3 dipendenti in una chiamata utilizzando l'operazione batch.
- Crea una query di inserimento per passare i valori della colonna.
- Aprire la connessione e creare un oggetto preparatoStatement utilizzando l'oggetto connessione e chiamare il metodo prepareStatement.
- Quindi impostare i valori per 1stdipendente utilizzando i metodi setXXX e chiama il metodo addBatch () per aggiungere la nuova riga nel batch.
- In questo modo, aggiungi i valori per 2nde 3rddipendenti. Dopo aver aggiunto le query nel metodo addBatch (), dovremmo chiamare il metodo executeBatch () utilizzando l'oggetto preparatoStatement.
- Il metodo executeBatch () inserisce i dati dei 3 dipendenti in una chiamata.
- Controllare la tabella DIPENDENTE se i dati sono stati inseriti correttamente o meno.
Stored procedure Java
Una stored procedure è un gruppo di istruzioni SQL che formano una singola unità ed eseguono un'attività specifica. Verranno utilizzati per eseguire una serie di operazioni o domande da eseguire su un server di database. Può essere compilato ed eseguito con parametri e risultati diversi.
Ogni procedura ha il suo nome univoco a cui fare riferimento. Questa unità di sottoprogramma è memorizzata come oggetto Database nel DB.
Un sottoprogramma non è altro che una procedura, e dovrebbe essere creato manualmente come vogliamo e memorizzato come un oggetto DB.
Le stored procedure sono blocchi indipendenti di un programma che è possibile memorizzare nel DB. Usando il nome della stored procedure, possiamo chiamarla ed eseguirla. Viene utilizzato principalmente per eseguire un processo in PL / SQL. La procedura può avere blocchi annidati o può essere annidata all'interno degli altri blocchi.
La procedura memorizzata ha 3 parti:
- Parte della dichiarazione (facoltativa): In questa parte, possiamo dichiarare le variabili, le costanti, i cursori, ecc., È una parte opzionale. In base ai requisiti, possiamo usarlo.
- Parte di esecuzione: Questa parte contiene la logica di business principale della procedura. Normalmente avrà un blocco di istruzioni SQL.
- Parte per la manipolazione eccezionale (opzionale): In questa parte, possiamo gestire l'eccezione che può verificarsi a causa del codice della parte di esecuzione. È anche opzionale.
In base ai requisiti, possiamo creare una procedura. Possiamo passare o recuperare i valori dai parametri.
Sono disponibili tre tipi di parametri nelle stored procedure. Sono:
- NEL: Viene utilizzato per passare il valore di input alla stored procedure. La procedura memorizzata utilizzerà il parametro di input nel programma come variabile di sola lettura. Il valore non può essere modificato all'interno dei sottoprogrammi. Oracle utilizza IN come modalità predefinita del parametro. È il parametro predefinito.
- SU: Viene utilizzato per restituire o ottenere il valore dalla stored procedure dopo l'esecuzione. È una variabile di lettura-scrittura all'interno dei sottoprogrammi. Il valore può essere modificato all'interno dei sottoprogrammi.
- DENTRO FUORI: Viene utilizzato per passare i valori di input alla stored procedure e restituire o ottenere i valori anche dalla procedura. È sia leggibile che scrivibile. Possiamo leggerlo e modificarlo.
RITORNO
Useremo la parola chiave return per restituire il controllo al programma principale, come il programma Java. Quando la procedura trova la parola chiave RETURN, uscirà dall'esecuzione e salterà il codice o l'istruzione successiva.
Come chiamare la stored procedure da Java
Abbiamo un'interfaccia CallableStatement in Java per chiamare Stored Procedure. L'oggetto dell'interfaccia CallableStatement può essere creato utilizzando il metodo prepareCall () dell'interfaccia Connection e successivamente, dovremmo chiamare il metodo executeQuery () per eseguire la Stored Procedure nel programma Java.
Prima di scrivere il programma Java per implementarlo, è necessario creare procedure memorizzate per utilizzarlo nel programma.
Di seguito è riportata la sintassi per richiamare le procedure memorizzate nel programma Java:
Sintassi | No di parametri |
---|---|
{chiama PROCEDURE_NAME ()} | Nessun parametro di input e nessun parametro di output |
{call PROCEDURE_NAME (?,?,?)} | Tre parametri di input e nessun parametro di output |
{? = chiama PROCEDURE_NAME ()} | Nessun parametro di input e un parametro di output (valore RETURN) |
{? = chiama PROCEDURE_NAME (?,?)} | Due parametri di input e un parametro di output (valore RETURN) |
Passaggi per creare stored procedure
# 1) Crea la procedura nel server DB. Qui stiamo usando Oracle DB.
# 2) Sintassi per la creazione della procedura completa:
Possiamo anche scrivere la procedura memorizzata in codice Java.
# 3) Passare i parametri IN e OUT per utilizzarli nella procedura.
# 4) La parola chiave AS / IS dovrebbe essere menzionata. Se stiamo aggiungendo un'altra procedura nella nuova procedura, usa la parola chiave IS oppure la parola chiave AS se la procedura è autonoma.
# 5) Dichiara le variabili, non è obbligatorio, in base al requisito che possiamo creare.
cos'è un buon cambia voce
# 6) Quindi INIZIARE la procedura utilizzando la parola chiave BEGIN e quindi scrivere le istruzioni o le query SQL da eseguire nella procedura.
# 7) Successivamente, possiamo gestire l'eccezione nella parte Eccezione. Inoltre, non è obbligatorio menzionarlo.
# 8) Terminare la procedura citando la parola chiave END e il nome della procedura.
Possiamo creare la procedura in Oracle e salvarla con un nome univoco e richiamare quella procedura dal programma Java. Possiamo creare la procedura e chiamarla anche in Java.
Creare una procedura in Oracle, salvarla e chiamare la procedura in Java Program.
# 1) Apri il server database. Qui stiamo usando il server Oracle DB.
#Due) Fare clic con il tasto destro sulla cartella Procedure e fare clic sull'opzione Nuova procedura.
# 3) Chiederà il nome della procedura e i dettagli dei parametri.
Nota: Possiamo fornire i dettagli del parametro anche durante la scrittura della procedura.
# 4) Scrivi la procedura utilizzando i passaggi che abbiamo già discusso in questo tutorial e salva la procedura con il nome univoco.
La procedura nello screenshot visualizzerà l'output in DB. Possiamo cambiarlo per visualizzarlo anche nel programma Java. Per questo, dobbiamo usare i parametri OUT.
# 5) Eseguire la procedura facendo clic sul pulsante Esegui
# 6) Immettere il valore nella colonna Valore di input. Visualizzerà i dati per il valore dato.
Fino ad ora, abbiamo visto come creare ed eseguire la procedura nella stessa console DB.
Crea la procedura in DB. Chiamalo e visualizza i dati nella console Java .
Creare la seguente procedura utilizzando i passaggi precedenti e salvarla con il nome 'DISPLAY_EMPLOYEE_DETAILS'.
Programma di esempio di stored procedure 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(); } } }
PRODUZIONE:
Spiegazione:
Nel programma sopra, quello che abbiamo fatto è aver creato una procedura e salvata in Oracle DB. Quindi ha chiamato quella procedura utilizzando CallableStatement e ha visualizzato i dati in Java Console.
- Crea la procedura e salvala in Oracle DB.
- Nel programma Java, aprire la connessione DB e chiamare il metodo prepareCall utilizzando la connessione e gli oggetti CallableStatement.
- Passare il valore del parametro di input utilizzando il metodo setXXX.
- Recuperare i valori dei parametri di output utilizzando il metodo registerOutParameter. In questo metodo, dovremmo passare il valore di indice del parametro e il tipo di dati del parametro. Memorizzerà i valori nell'indice dei parametri.
- Utilizzando i metodi getXXX, possiamo recuperare i dati e visualizzarli nella console Java.
Crea la procedura ed eseguila nel programma Java stesso.
Programma 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(); } } }
PRODUZIONE:
Dati nella tabella Employee_details prima dell'esecuzione del programma:
Dati nella tabella Employee_details dopo l'esecuzione del programma:
Spiegazione:
Nel programma sopra, memorizziamo il codice della procedura come una stringa.
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;
';
- Aprire Oracle DB Connection e creare l'oggetto istruzione utilizzando l'oggetto connessione.
- Chiama il metodo createStatement utilizzando l'oggetto istruzione, perché stiamo creando la procedura in codice Java.
- Chiama la procedura usando la sintassi {chiama UPD_EMPLOYEE_DETAILS (?,?) per preparare il metodo CallableStatement.
- Dato che stiamo creando la procedura in codice Java, dobbiamo eseguire quel 'Crea codice procedura'.
- Per eseguire quella procedura, chiama il metodo execute usando l'oggetto Statement ' stmt.execute (Stored_Procedure) '. Questo creerà temporaneamente la procedura nel DB.
- Lo scopo della procedura è la fine dell'esecuzione del programma. Dopodiché, non sarà disponibile. Utilizzando i metodi setXXX, impostare i valori da aggiornare nella tabella Employee_Details.
- Chiama il metodo executeUpdate utilizzando l'oggetto callableStatement. Questo metodo aggiornerà i valori nel racconto Empoyee_Details.
- Controlla la tabella Employee_details se i dati sono stati aggiornati correttamente.
Punti da ricordare:
- L'elaborazione in batch migliora le prestazioni e mantiene la coerenza dei dati.
- L'esecuzione di più istruzioni SQL in una transazione è nota come elaborazione batch.
- La stored procedure è il blocco di istruzioni SQL utilizzato per eseguire la logica aziendale.
- Possiamo passare il parametro di input utilizzando la parola chiave IN alla procedura e la parola chiave OUT per il parametro di output.
- Possiamo creare una procedura nel server DB stesso e utilizzare temporaneamente anche il codice Java.
Domande frequenti
D # 1) Quale interfaccia deve essere utilizzata per eseguire l'elaborazione batch in JDBC?
Risposta: Il pacchetto Java ha interfacce Statement e PreparedStatement, che forniscono i metodi per eseguire l'elaborazione batch.
D # 2) Come funzionano gli aggiornamenti batch in JDBC?
Risposta: Un aggiornamento batch JDBC è un insieme di aggiornamenti raggruppati e inviati al database in una volta sola invece di inviare gli aggiornamenti uno per uno. Pertanto, riduce il traffico di rete nel database.
D # 3) In che modo l'elaborazione in batch aumenta le prestazioni?
Risposta: L'elaborazione batch invia i dati al database in una sola volta (solo 1 round trip) anziché inviarli uno per uno, e il database potrebbe essere in grado di eseguire alcune istruzioni in parallelo. In questo modo, aumenta le prestazioni dell'applicazione e fa risparmiare tempo.
D # 4) Quali sono i parametri accettati nelle procedure memorizzate in JDBC?
Risposta: Esistono tre tipi di parametri: parametri IN, OUT e INOUT. Il parametro IN serve per ottenere il valore di input. Il parametro OUT serve per recuperare il valore di uscita. Il parametro INOUT viene utilizzato sia per l'ingresso che per l'uscita.
D # 5) Quali sono i metodi disponibili per eseguire una procedura memorizzata in JDBC?
Risposta: Utilizzando l'interfaccia CallableStatement, possiamo chiamare la procedura. L'interfaccia CallableStatement fornisce tre metodi per eseguire le stored procedure.
I tre metodi sono:
- executeUpdate (): Utilizza questo metodo se la procedura non restituisce alcun valore restituito.
- executeQuery (): Utilizzare questo metodo se la procedura restituisce un solo gruppo di risultati.
- eseguire(): Utilizzare questo metodo se la procedura restituisce molti gruppi di risultati o un numero sconosciuto di gruppi di risultati.
Conclusione
In questo tutorial abbiamo trattato l'elaborazione in batch e le stored procedure. Nel mondo moderno, prestazioni elevate, coerenza dei dati e riutilizzabilità sono le parole d'ordine per qualsiasi applicazione popolare. Sia l'elaborazione batch che le stored procedure svolgono un ruolo molto importante nell'implementazione di queste funzionalità. La conoscenza di questi è inevitabile per ogni ingegnere del software.
Lettura consigliata
- Tutorial Java JDBC: cos'è JDBC (Java Database Connectivity)
- Tutorial di connessione Java JDBC con esempio di programmazione
- Gestione transazioni Java JDBC con esempio
- ResultSet JDBC: come utilizzare il ResultSet Java per recuperare i dati
- Gestione delle eccezioni JDBC - Come gestire le eccezioni SQL
- JDBC DriverManager, JDBC PreparedStatement e Statement
- Tutorial JAVA per principianti: oltre 100 tutorial video Java pratici