jdbc batch processing
Tento tutoriál poskytuje úplné pochopenie dávkového spracovania JDBC a procedúry Java Stored Procedure s ukážkami príkladov Java:
V Spracovanie výnimiek JDBC návod na Séria výukových programov JDBC , sme sa naučili spôsoby, ako zvládnuť výnimky SQL pomocou príkladov programovania.
V tomto výučbe sa budeme zaoberať metódami dávkového spracovania v Jave pomocou ovládača JDBC. Dozvieme sa tiež, ako vytvárať uložené procedúry a volať ich z programu Java.
Začnime pochopením dávkového spracovania a jeho výhodami.
Čo sa dozviete:
Dávkové spracovanie JDBC
Je to proces vykonávania viacerých príkazov SQL v jednej transakcii. Tento proces skracuje čas komunikácie a zvyšuje výkon. Veľmi uľahčuje spracovanie veľkého množstva údajov.
Výhody dávkového spracovania
Cieľom hromadného spracovania je zlepšiť výkon a konzistenciu údajov.
Výkon
Zvážte scenár, keď sa má do tabuľky z programu JAVA pridať viac (napríklad 5) záznamov. Priamym prístupom bude otvorenie pripojenia k databáze, zápis INSERT dotazov a vykonanie každého dotazu pomocou príkazu Statement alebo PreparedStatement.
Tento prístup zvýši počet sieťových výpadkov do databázy a vo výsledku povedie k zlému výkonu. Pomocou dávkového spracovania môžeme túto operáciu vykonať v jednom hovore.
Konzistencia údajov
V niektorých prípadoch musíme vložiť / aktualizovať údaje vo viacerých tabuľkách. To povedie k vzájomne súvisiacej transakcii, kde je dôležitá postupnosť vkladaných alebo aktualizovaných dotazov. Akékoľvek chyby, ktoré sa vyskytnú počas vykonávania, by mali za následok vrátenie údajov vložených predchádzajúcimi dotazmi, ak existujú.
Príklad:
# 1) Tabuľka „EMPLOYEE_DETAILS“ má 3 stĺpce: ID , názov a Úloha zamestnanca.
statement.execute('INSERT INTO EMPLOYEE_DETAILS(ID, NAME, ROLE) ' + 'VALUES ('1','EMPLOYEE_NAME1','ROLE1')');
#dva) Tabuľka „EMPLOYEE_ADDRESS“ má 2 stĺpce: EMP ID a Adresa
statement.execute('INSERT INTO EMPLOYEE_ADDRESS( EMP_ID, ADDRESS) ' + 'VALUES ('1','ADDRESS1')');
Problém sa môže vyskytnúť vo vyššie uvedenom príklade, keď sa prvý príkaz úspešne vykoná, ale druhý príkaz zlyhá. V tejto situácii nedôjde k vráteniu údajov vložených prvým vyhlásením. To vedie k nekonzistentnosti údajov.
Konzistenciu údajov môžeme dosiahnuť spáchaním transakcie na konci alebo vykonaním rollbacku v prípade akýchkoľvek výnimiek. Aby sme to však dosiahli, musí byť DB zasiahnutý opakovane pri každom výroku.
Na druhej strane, pri dávkovom spracovaní budú údaje potvrdené, až keď sa všetky dotazy v dávke úspešne vykonajú. Inak to nebude.
Ako vykonávať dávkové spracovanie
Môžeme vykonať dávkové spracovanie pomocou metód addbatch () a executeBatch (), ktoré sú k dispozícii v triedach Statement aj PreparedStatement.
V tejto príručke sú všetky programy napísané v jazyku Java. Použili sme verziu Java 8 a Oracle DB.
=> Kliknutím sem stiahnete softvér Oracle
=> Kliknite sem a stiahnite si verziu Java 8
V nasledujúcom príklade uvidíme, ako komplikovane urobiť dávkové spracovanie. Má proces inštalácie Java krok za krokom.
Údaje v tabuľke ZAMESTNANCI pred vložením údajov:
ako zostaviť bránu firewall pre Windows
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();} } }
VÝKON:
Údaje v tabuľke ZAMESTNANCOV po vložení údajov:
Vysvetlenie:
Vo vyššie uvedenom programe sme vložili údaje 3 zamestnancov do jedného hovoru pomocou dávkovej operácie.
- Vytvorte jeden vkladací dotaz na odovzdanie hodnôt stĺpca.
- Otvorte pripojenie a pomocou objektu pripojenia vytvorte objekt readyStatement a zavolajte metódu prepareStatement.
- Potom nastavte hodnoty pre 1svzamestnanec používajúci metódy setXXX a zavolať metódu addBatch () na pridanie nového riadku do dávky.
- Takto pridajte hodnoty pre 2nda 3rdzamestnancov. Po pridaní dotazov do metódy addBatch () by sme mali zavolať metódu executeBatch () pomocou objektu readyStatement.
- Metóda executeBatch () vloží údaje 3 zamestnancov do jedného hovoru.
- Skontrolujte tabuľku ZAMESTNANEC, či boli údaje vložené správne alebo nie.
Uložené procedúry Java
Uložená procedúra je skupina príkazov SQL, ktoré tvoria jednu jednotku a vykonávajú konkrétnu úlohu. Budú sa používať na vykonávanie množiny operácií alebo otázok na vykonanie na databázovom serveri. Môže byť zostavený a vykonaný s rôznymi parametrami a výsledkami.
Každý postup má svoj jedinečný názov, na ktorý sa má odkazovať. Táto podprogramová jednotka je uložená ako databázový objekt v DB.
Podprogram nie je nič iné ako postup a mal by sa vytvárať ručne, ako chceme, a uložiť ho ako objekt DB.
Uložené procedúry sú samostatné bloky programu, ktoré môžeme uložiť v DB. Použitím názvu uloženej procedúry ju môžeme zavolať a vykonať. Používa sa hlavne na vykonanie procesu v PL / SQL. Procedúra môže mať vnorené bloky alebo môže byť vnorená do ostatných blokov.
Uložená procedúra má 3 časti:
- Vyhlásenie (voliteľné): V tejto časti môžeme deklarovať premenné, konštanty, kurzory atď., Je to voliteľná časť. Na základe požiadaviek ho môžeme použiť.
- Exekučná časť: Táto časť obsahuje hlavnú obchodnú logiku postupu. Normálne bude mať blok príkazov SQL.
- Výnimočná manipulačná časť (voliteľná): V tejto časti môžeme spracovať výnimku, ktorá sa môže vyskytnúť v dôsledku kódu časti Execution. Je to tiež voliteľné.
Na základe požiadaviek dokážeme vytvoriť postup. Hodnoty môžeme odovzdať alebo načítať z parametrov.
V ponuke Uložené procedúry sú k dispozícii tri typy parametrov. Oni sú:
- IN: Používa sa na prenos vstupnej hodnoty do uloženej procedúry. Uložená procedúra použije vstupný parameter v programe ako premennú iba na čítanie. Hodnotu nie je možné zmeniť vo vnútri podprogramov. Oracle používa ako predvolený režim parametra IN. Je to predvolený parameter.
- VON: Používa sa na vrátenie alebo získanie hodnoty z uloženej procedúry po vykonaní. Je to premenná na čítanie a zápis vo vnútri podprogramov. Hodnotu je možné meniť vo vnútri podprogramov.
- DNU VON: Používa sa na odovzdanie vstupných hodnôt do uloženej procedúry a tiež na vrátenie alebo získanie hodnôt z procedúry. Je čitateľný aj zapisovateľný. Môžeme to čítať a upravovať.
NÁVRAT
Pomocou kľúčového slova return vrátime kontrolu späť hlavnému programu, napríklad programu Java. Keď procedúra nájde kľúčové slovo RETURN, ukončí vykonávanie a preskočí za ním kód alebo príkaz.
Ako zavolať uloženú procedúru z Javy
V Jave máme rozhranie CallableStatement na volanie uloženej procedúry. Objekt rozhrania CallableStatement je možné vytvoriť pomocou metódy prepareCall () rozhrania Connection a potom by sme mali zavolať metódu executeQuery () na vykonanie programu Uložená procedúra v Jave.
Pred napísaním programu Java na jeho implementáciu by sme mali vytvoriť uložené procedúry, ktoré ho použijeme v programe.
Nasleduje syntax na volanie uložených procedúr v programe Java:
Syntax | Počet parametrov |
---|---|
{hovor PROCEDURE_NAME ()} | Žiadne vstupné parametre a žiadne výstupné parametre |
{volať PROCEDURE_NAME (?,?,?)} | Tri vstupné parametre a žiadne výstupné parametre |
{? = volať PROCEDURE_NAME ()} | Žiadne vstupné parametre a jeden výstupný parameter (RETURN Value) |
{? = volať PROCEDURE_NAME (?,?)} | Dva vstupné parametre a jeden výstupný parameter (RETURN Value) |
Kroky na vytvorenie uložených postupov
# 1) Vytvorte postup na serveri DB. Tu používame Oracle DB.
# 2) Syntax pre vytvorenie úplného postupu:
Uloženú procedúru môžeme napísať aj do Java kódu.
# 3) Zadajte parametre IN a OUT, aby ste ich mohli použiť v postupe.
# 4) Malo by sa spomenúť kľúčové slovo AS / IS. Ak do nového postupu pridávame ďalší postup, použite kľúčové slovo IS alebo iné kľúčové slovo AS, ak je postup samostatný.
# 5) Deklarujte premenné, nie je to povinné, na základe požiadavky, ktorú môžeme vytvoriť.
# 6) Potom ZAČNITE procedúru pomocou kľúčového slova BEGIN a potom napíšte príkazy alebo dotazy SQL, ktoré sa majú v procedúre vykonať.
# 7) Ďalej môžeme spracovať výnimku v časti Výnimka. Nie je tiež povinné spomínať.
# 8) Ukončite procedúru uvedením kľúčového slova END a názvu procedúry.
Procedúru môžeme vytvoriť v Oracle a uložiť ju s jedinečným názvom a zavolať túto procedúru z programu Java. Môžeme vytvoriť procedúru a zavolať ju tiež v Jave.
Vytvorte procedúru v Oracle, uložte ju a zavolajte procedúru v Java programe.
# 1) Otvorte databázový server. Tu používame server Oracle DB.
#dva) Pravým tlačidlom myši kliknite na priečinok Procedúra a kliknite na možnosť Nový postup.
čo je sieťový bezpečnostný kľúč
# 3) Požiada o názov postupu a podrobnosti parametra.
Poznámka: Aj pri písaní postupu môžeme uviesť podrobnosti o parametri.
# 4) Procedúru napíšte podľa krokov, ktoré sme si už rozobrali v tomto tutoriále, a procedúru uložte s jedinečným názvom.
Postup na snímke obrazovky zobrazí výstup v databáze DB. Môžeme to zmeniť tak, aby sa zobrazovali aj v programe Java. Na to musíme použiť OUT parametre.
# 5) Procedúru spustíte kliknutím na tlačidlo spustenia
# 6) Zadajte hodnotu do stĺpca Input Value. Zobrazí údaje pre danú hodnotu.
Doteraz sme videli, ako vytvoriť a vykonať procedúru v samotnej konzole DB.
Vytvorte postup v DB. Zavolajte to a zobrazte údaje v konzole Java .
Pomocou vyššie uvedených krokov vytvorte nasledujúci postup a uložte ho s názvom „DISPLAY_EMPLOYEE_DETAILS“.
Ukážkový program uloženej procedúry 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(); } } }
VÝKON:
Vysvetlenie:
Vo vyššie uvedenom programe sme vytvorili jeden postup, ktorý sme uložili do programu Oracle DB. Potom zavolal tento postup pomocou CallableStatement a zobrazil údaje v Java Console.
- Vytvorte postup a uložte ho do Oracle DB.
- V programe Java otvorte pripojenie DB a zavolajte metódu prepareCall pomocou objektov connection a CallableStatement.
- Zadajte hodnotu vstupného parametra pomocou metódy setXXX.
- Načítajte hodnoty výstupných parametrov pomocou metódy registerOutParameter. V tejto metóde by sme mali odovzdať hodnotu indexu parametra a dátový typ parametra. Uloží hodnoty do indexu parametrov.
- Pomocou metód getXXX môžeme načítať údaje a zobraziť ich v konzole Java.
Vytvorte postup a vykonajte ho v samotnom programe Java.
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(); } } }
VÝKON:
Údaje v tabuľke Employee_details pred vykonaním programu:
Údaje v tabuľke Employee_details po vykonaní programu:
Vysvetlenie:
Vo vyššie uvedenom programe uložíme kód procedúry ako reťazec.
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;
';
- Otvorte pripojenie Oracle DB a vytvorte objekt výpisu pomocou objektu pripojenia.
- Zavolajte metódu createStatement pomocou príkazového objektu, pretože procedúru vytvárame v kóde Java.
- Procedúru zavolajte pomocou syntaxe {volať UPD_EMPLOYEE_DETAILS (?,?) pripraviť metódu CalCableStatement.
- Pretože vytvárame procedúru v kóde Java, musíme vykonať tento „Vytvoriť procedúrny kód“.
- Ak chcete vykonať tento postup, zavolajte metódu execute pomocou objektu Statement “ stmt.execute (Stored_Procedure) “. Týmto sa procedúra vytvorí dočasne v DB.
- Rozsahom konania je koniec vykonávania programu. Potom už nebude k dispozícii. Pomocou metód setXXX nastavte hodnoty, ktoré sa majú aktualizovať, v tabuľke Employee_Details.
- Zavolajte metódu executeUpdate pomocou objektu callableStatement. Táto metóda aktualizuje hodnoty v rozprávke Empoyee_Details.
- Skontrolujte tabuľku Employee_details, či boli údaje správne aktualizované.
Body na zapamätanie:
- Dávkové spracovanie zlepšuje výkon a udržuje konzistenciu údajov.
- Vykonávanie viacerých príkazov SQL v jednej transakcii je známe ako dávkové spracovanie.
- Uložená procedúra je blok príkazov SQL, ktorý sa používa na vykonávanie obchodnej logiky.
- Vstupný parameter môžeme odovzdať pomocou kľúčového slova IN do procedúry a kľúčové slovo OUT pre výstupný parameter.
- Môžeme vytvoriť procedúru na samotnom serveri DB a dočasne tiež pomocou kódu Java.
často kladené otázky
Otázka 1) Ktoré rozhranie by sa malo použiť na vykonávanie dávkového spracovania v JDBC?
Odpoveď: Balík Java má rozhrania Statement a PreparedStatement, ktoré poskytujú metódy na dávkové spracovanie.
Otázka 2) Ako fungujú dávkové aktualizácie v JDBC?
Odpoveď: Dávková aktualizácia JDBC je skupina aktualizácií zoskupených a odoslaných do databázy naraz, namiesto postupného odosielania aktualizácií. Znižuje teda sieťový prenos v databáze.
Otázka č. 3) Ako zvyšuje dávkové spracovanie výkon?
Odpoveď: Dávkové spracovanie odosiela údaje do databázy naraz (iba jeden spiatočný let) namiesto jedného po druhom a databáza môže byť schopná vykonávať niektoré príkazy paralelne. Takto sa zvyšuje výkon aplikácie a šetrí čas.
Otázka č. 4) Aké sú parametre akceptované v uložených procedúrach v JDBC?
Odpoveď: Existujú tri typy parametrov - parametre IN, OUT a INOUT. Parameter IN slúži na získanie vstupnej hodnoty. Parameter OUT slúži na získanie výstupnej hodnoty. Parameter INOUT sa používa pre vstup aj výstup.
Otázka č. 5) Aké sú dostupné metódy na vykonanie uloženej procedúry v JDBC?
Odpoveď: Pomocou rozhrania CallableStatement môžeme zavolať procedúru. Rozhranie CallableStatement poskytuje tri metódy na vykonávanie uložených procedúr.
Tieto tri metódy sú:
- executeUpdate (): Túto metódu použite, ak postup nevráti žiadne návratové hodnoty.
- executeQuery (): Túto metódu použite, ak procedúra vráti iba jednu sadu výsledkov.
- vykonať (): Túto metódu použite, ak procedúra vráti veľa sád výsledkov alebo neznámy počet sád výsledkov.
Záver
V tomto výučbe sme sa zaoberali dávkovým spracovaním a uloženými procedúrami. V modernom svete sú heslá všetkých populárnych aplikácií vysoký výkon, konzistencia údajov a opätovné použitie. Dávkové spracovanie aj uložené procedúry hrajú pri implementácii týchto funkcií veľmi dôležitú úlohu. Znalosti o nich sú nevyhnutné pre každého softvérového inžiniera.
Odporúčané čítanie
- Výukový program Java JDBC: Čo je JDBC (pripojenie k databáze Java)
- Výukový program pre pripojenie Java JDBC s príkladom programovania
- Správa transakcií Java JDBC s príkladom
- JDBC ResultSet: Ako používať Java ResultSet na načítanie údajov
- Spracovanie výnimiek JDBC - Ako zaobchádzať s výnimkami SQL
- JDBC DriverManager, JDBC PreparedStatement And Statement
- Výukový program JAVA pre začiatočníkov: viac ako 100 praktických výučbových programov Java Video