Skupna obrada u JDBC

Java Top

Upravo sam najavio novo Uči proljeće tečaj, usredotočen na osnove Spring 5 i Spring Boot 2:

>> PROVJERITE TEČAJ

1. Uvod

Java Database Connectivity (JDBC) je Java API koji se koristi za interakciju s bazama podataka. Skupna obrada grupira više upita u jednu jedinicu i prosljeđuje ga u jednom mrežnom putovanju u bazu podataka.

U ovom ćemo članku otkriti kako se JDBC može koristiti za skupnu obradu SQL upita.

Za više informacija o JDBC-u možete pogledati naš uvodni članak ovdje.

2. Zašto serijska obrada?

Izvedba i dosljednost podataka primarni su motivi za serijsku obradu.

2.1. Poboljšane performanse

Neki slučajevi upotrebe zahtijevaju umetanje velike količine podataka u tablicu baze podataka. Dok se koristi JDBC, jedan od načina da se to postigne bez batch obrade je izvršavanje više upita uzastopno.

Pogledajmo primjer sekvencijalnih upita poslanih u bazu podataka:

statement.execute ("INSERT IN TO EMPLOYEE (ID, NAME, DESIGNATION)" + "VRIJEDNOSTI ('1', 'EmployeeName1', 'Oznaka1')"); statement.execute ("INSERT IN TO EMPLOYEE (ID, NAME, DESIGNATION)" + "VRIJEDNOSTI ('2', 'EmployeeName2', 'Oznaka2')");

Ovi sekvencijalni pozivi povećat će broj mrežnih putovanja do baze podataka što rezultira lošim performansama.

Korištenjem skupne obrade, ovi se upiti mogu poslati u bazu podataka u jednom pozivu, čime se poboljšavaju performanse.

2.2. Dosljednost podataka

U određenim okolnostima podatke treba ugurati u više tablica. To dovodi do međusobno povezane transakcije gdje je važan slijed upita koji se guraju.

Sve pogreške koje se pojave tijekom izvršavanja trebale bi rezultirati povratom podataka potisnutih prethodnim upitima, ako ih ima.

Pogledajmo primjer dodavanja podataka u više tablica:

statement.execute ("INSERT IN TO EMPLOYEE (ID, NAME, DESIGNATION)" + "VRIJEDNOSTI ('1', 'EmployeeName1', 'Oznaka1')"); statement.execute ("INSERT INTO EMP_ADDRESS (ID, EMP_ID, ADDRESS)" + "VRIJEDNOSTI ('10', '1', 'Address')"); 

Tipičan problem u gore navedenom pristupu pojavljuje se kad prva izjava uspije, a druga izjava ne uspije. U ovoj situaciji nema vraćanja podataka umetnutih prvom izjavom, što dovodi do nedosljednosti podataka.

Dosljednost podataka možemo postići obuhvaćanjem transakcije u više umetanja / ažuriranja, a zatim izvršavanjem transakcije na kraju ili izvođenjem vraćanja u slučaju iznimki, ali u ovom slučaju još uvijek ponavljamo udaranje u bazu podataka za svaki izraz.

3. Kako napraviti serijsku obradu

JDBC nudi dvije klase, Izjava i PreparedStatement za izvršavanje upita u bazi podataka. Oba razreda imaju vlastitu implementaciju addBatch () i executeBatch () metode koje nam pružaju funkcionalnost serijske obrade.

3.1. Skupna obrada pomoću Izjava

S JDBC-om, najjednostavniji način izvršavanja upita u bazi podataka je putem Izjava objekt.

Prvo, pomoću addBatch () možemo dodati sve SQL upite u paket, a zatim izvršiti te SQL upite pomoću executeBatch ().

Tip povrata executeBatch () je int niz koji pokazuje na koliko je zapisa utjecalo izvršavanje svakog SQL izraza.

Pogledajmo primjer stvaranja i izvršavanja serije pomoću Statementa:

Izjava o izjavi = connection.createStatement (); statement.addBatch ("INSERT IN TO EMPLOYEE (ID, NAME, DESIGNATION)" + "VRIJEDNOSTI ('1', 'EmployeeName', 'Oznaka')"); statement.addBatch ("INSERT INTO EMP_ADDRESS (ID, EMP_ID, ADDRESS)" + "VRIJEDNOSTI ('10', '1', 'Address')"); statement.executeBatch (); 

U gornjem primjeru pokušavamo umetnuti zapise u ZAPOSLENIK i EMP_ADRESA tablice pomoću Izjava. Možemo vidjeti kako se dodaju SQL upiti u paket koji treba izvršiti.

3.2. Skupna obrada pomoću PreparedStatement

PreparedStatement je druga klasa koja se koristi za izvršavanje SQL upita. Omogućuje ponovnu upotrebu SQL izraza i zahtijeva da postavimo nove parametre za svako ažuriranje / umetanje.

Pogledajmo primjer korištenja PreparedStatement. Prvo smo postavili izjavu pomoću SQL upita kodiranog kao Niz:

String [] ZAPOSLENI = novi niz [] {"Zuck", "Mike", "Larry", "Musk", "Steve"}; String [] DESIGNATIONS = novi niz [] {"CFO", "CSO", "CTO", "CEO", "CMO"}; String insertEfficieeSQL = "UMESTI U ZAPOSLENOG (ID, IME, DIZAJN)" + "VRIJEDNOSTI (?,?,?)"; PreparedStatement workerStmt = connection.prepareStatement (umetniteEeeeeSQL);

Dalje, petljamo kroz niz Niz vrijednosti i dodajte novokonfigurirani upit u paket.

Nakon završetka petlje izvršavamo batch:

for (int i = 0; i <EMPLOYEES.length; i ++) {String workerId = UUID.randomUUID (). toString (); workerStmt.setString (1, workerId); workerStmt.setString (2, ZAPOSLENI [i]); workerStmt.setString (3, DIZAJNACIJE [i]); workerStmt.addBatch (); } workerStmt.executeBatch (); 

U gore prikazanom primjeru umetamo zapise u ZAPOSLENIK stol koristeći PreparedStatement. Možemo vidjeti kako se vrijednosti koje se umetaju postavljaju u upit, a zatim dodaju u paket koji treba izvršiti.

4. Zaključak

U ovom smo članku vidjeli kako je batch obrada SQL upita važna tijekom interakcije s bazama podataka pomoću JDBC-a.

Kao i uvijek, kôd povezan s ovim člankom možete pronaći na Githubu.

Dno Java

Upravo sam najavio novo Uči proljeće tečaj, usredotočen na osnove Spring 5 i Spring Boot 2:

>> PROVJERITE TEČAJ