Dávkové spracovanie v JDBC

Java Top

Práve som oznámil nové Naučte sa jar kurz zameraný na základy jari 5 a Spring Boot 2:

>> SKONTROLUJTE KURZ

1. Úvod

Java Database Connectivity (JDBC) je rozhranie Java API používané na interakciu s databázami. Dávkové spracovanie zoskupuje viac dotazov do jednej jednotky a odovzdáva ich v jednom sieťovom výlete do databázy.

V tomto článku zistíme, ako je možné použiť JDBC na dávkové spracovanie dotazov SQL.

Viac informácií o JDBC nájdete v našom úvodnom článku tu.

2. Prečo dávkové spracovanie?

Výkon a konzistencia údajov sú hlavnými motívmi dávkového spracovania.

2.1. Zlepšený výkon

Niektoré prípady použitia vyžadujú vloženie veľkého množstva údajov do databázovej tabuľky. Pri používaní JDBC je jedným zo spôsobov, ako to dosiahnuť bez dávkového spracovania, vykonávanie viacerých dotazov postupne.

Pozrime sa na príklad postupných dotazov odosielaných do databázy:

statement.execute ("VLOŽTE DO ZAMESTNANCA (ID, MENO, OZNAČENIE)" + "HODNOTY ('1', 'EmployeeName1', 'Označenie1')"); statement.execute ("VLOŽTE DO ZAMESTNANCA (ID, MENO, URČENIE)" + "HODNOTY ('2', 'EmployeeName2', 'Označenie2')");

Tieto postupné volania zvýšia počet sieťových prechodov do databázy, čo bude mať za následok zlý výkon.

Použitím dávkového spracovania môžu byť tieto dotazy odoslané do databázy v rámci jedného hovoru, čím sa zlepší výkon.

2.2. Konzistencia údajov

Za určitých okolností je potrebné údaje vložiť do viacerých tabuliek. To vedie k vzájomne súvisiacej transakcii, kde je dôležitá postupnosť tlačených dotazov.

Akékoľvek chyby, ktoré sa vyskytnú počas vykonávania, by mali mať za následok vrátenie údajov vytlačených predchádzajúcimi dotazmi, ak existujú.

Pozrime sa na príklad pridania údajov do viacerých tabuliek:

statement.execute ("INSERT INTO EMPLOYEE (ID, NAME, DESIGNATION)" + "VALUES ('1', 'EmployeeName1', 'Designation1')"); statement.execute ("INSERT INTO EMP_ADDRESS (ID, EMP_ID, ADDRESS)" + "VALUES ('10', '1', 'Address')"); 

Typický problém vo vyššie uvedenom prístupe nastáva, keď je prvý príkaz úspešný a druhý príkaz zlyhá. V tejto situácii nedôjde k vráteniu údajov vložených prvým príkazom, čo by viedlo k nekonzistencii údajov.

Konzistenciu údajov môžeme dosiahnuť rozložením transakcie na viac vložených / aktualizovaných údajov a následným vykonaním transakcie alebo vykonaním rollbacku v prípade výnimiek, ale v tomto prípade stále zasahujeme do databázy opakovane pre každý príkaz.

3. Ako urobiť dávkové spracovanie

JDBC poskytuje dve triedy, Vyhlásenie a Pripravené vyhlásenie na vykonávanie dotazov v databáze. Obe triedy majú vlastnú implementáciu addBatch () a executeBatch () metódy, ktoré nám poskytujú funkčnosť dávkového spracovania.

3.1. Dávkové spracovanie pomocou Vyhlásenie

S JDBC je najjednoduchší spôsob, ako vykonávať dotazy v databáze, prostredníctvom servera Vyhlásenie objekt.

Najskôr pomocou addBatch () môžeme pridať všetky SQL dotazy do dávky a potom tieto SQL dotazy vykonať pomocou executeBatch ().

Návratový typ executeBatch () je int pole označujúce koľko záznamov bolo ovplyvnených vykonaním každého príkazu SQL.

Pozrime sa na príklad vytvorenia a vykonania dávky pomocou príkazu:

Vyhlásenie vyhlásenie = connection.createStatement (); statement.addBatch ("INSERT INTO EMPLOYEE (ID, NAME, DESIGNATION)" + "VALUES ('1', 'EmployeeName', 'Určenie')"); statement.addBatch ("INSERT INTO EMP_ADDRESS (ID, EMP_ID, ADDRESS)" + "VALUES ('10', '1', 'Address')"); statement.executeBatch (); 

Vo vyššie uvedenom príklade sa pokúšame vložiť záznamy do súboru ZAMESTNANEC a EMP_ADDRESS tabuľky pomocou Vyhlásenie. Vidíme, ako sa do dávky, ktorá sa má vykonať, pridávajú dotazy SQL.

3.2. Dávkové spracovanie pomocou Pripravené vyhlásenie

Pripravené vyhlásenie je ďalšia trieda používaná na vykonávanie dotazov SQL. Umožňuje opätovné použitie príkazov SQL a vyžaduje od nás nastavenie nových parametrov pre každú aktualizáciu / vloženie.

Pozrime sa na príklad použitia Pripravené vyhlásenie. Najskôr sme príkaz nastavili pomocou dotazu SQL zakódovaného ako a Reťazec:

Reťazec [] EMPLOYEES = nový Reťazec [] {"Zuck", "Mike", "Larry", "Musk", "Steve"}; Reťazec [] DESIGNATIONS = nový Reťazec [] {"CFO", "CSO", "CTO", "CEO", "CMO"}; Reťazec insertEmployeeSQL = "VLOŽIŤ DO ZAMESTNANCA (ID, MENO, OZNAČENIE)" + "HODNOTY (?,?,?)"; PreparedStatement employeeStmt = connection.prepareStatement (insertEmployeeSQL);

Ďalej prechádzame radom polí String hodnoty a do dávky pridať novo nakonfigurovaný dotaz.

Po dokončení slučky vykonáme dávku:

for (int i = 0; i <EMPLOYEES.length; i ++) {String employeeId = UUID.randomUUID (). toString (); employeeStmt.setString (1, employeeId); employeeStmt.setString (2, ZAMESTNANCI [i]); employeeStmt.setString (3, NÁZVY [i]); employeeStmt.addBatch (); } employeeStmt.executeBatch (); 

V príklade uvedenom vyššie vkladáme záznamy do ZAMESTNANEC stôl pomocou Pripravené vyhlásenie. Vidíme, ako sa hodnoty, ktoré sa majú vložiť, nastavia v dotaze a potom sa pridajú k dávke, ktorá sa má vykonať.

4. Záver

V tomto článku sme videli, aké dôležité je dávkové spracovanie dotazov SQL pri interakcii s databázami pomocou JDBC.

Ako vždy, kód súvisiaci s týmto článkom nájdete na Githube.

Java dole

Práve som oznámil nové Naučte sa jar kurz zameraný na základy jari 5 a Spring Boot 2:

>> SKONTROLUJTE KURZ

$config[zx-auto] not found$config[zx-overlay] not found