Партидна обработка в JDBC

Java Top

Току що обявих новия курс Learn Spring , фокусиран върху основите на Spring 5 и Spring Boot 2:

>> ПРЕГЛЕД НА КУРСА

1. Въведение

Java Database Connectivity (JDBC) е Java API, използван за взаимодействие с бази данни. Груповата обработка групира множество заявки в едно звено и го предава в едно мрежово пътуване към база данни.

В тази статия ще открием как JDBC може да се използва за групова обработка на SQL заявки.

За повече информация относно JDBC можете да разгледате нашата статия за въвеждане тук.

2. Защо групова обработка?

Производителността и последователността на данните са основните мотиви за групова обработка.

2.1. Подобрена производителност

Някои случаи на употреба изискват голямо количество данни да бъдат вмъкнати в таблица на базата данни. Докато използвате JDBC, един от начините за постигане на това без групова обработка е последователното изпълнение на множество заявки.

Нека да видим пример за последователни заявки, изпратени до база данни:

statement.execute("INSERT INTO EMPLOYEE(ID, NAME, DESIGNATION) " + "VALUES ('1','EmployeeName1','Designation1')"); statement.execute("INSERT INTO EMPLOYEE(ID, NAME, DESIGNATION) " + "VALUES ('2','EmployeeName2','Designation2')");

Тези последователни повиквания ще увеличат броя на мрежовите пътувания до база данни, което води до лоша производителност.

Чрез групова обработка тези заявки могат да бъдат изпратени до базата данни с едно обаждане, като по този начин се подобрява производителността.

2.2. Последователност на данните

При определени обстоятелства данните трябва да се вкарат в множество таблици. Това води до взаимосвързана транзакция, при която е важна последователността на изпращаните заявки.

Всички грешки, възникващи по време на изпълнение, трябва да доведат до връщане на данните, изтласкани от предишни заявки, ако има такива.

Нека да видим пример за добавяне на данни към множество таблици:

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')"); 

Типичен проблем в горния подход възниква, когато първото твърдение е успешно и второто твърдение се провали. В тази ситуация няма връщане на данните, вмъкнати от първия оператор, което води до несъответствие на данните.

Можем да постигнем съгласуваност на данните, като обхванем транзакция в множество вмъквания / актуализации и след това ангажираме транзакцията в края или извършим възстановяване в случай на изключения, но в този случай все още удряме многократно базата данни за всеки оператор.

3. Как да направите пакетна обработка

JDBC предоставя два класа, Statement и PreparedStatement за изпълнение на заявки в базата данни. И двата класа имат собствена реализация на методите addBatch () и executeBatch () , които ни предоставят функционалността за групова обработка.

3.1. Партидна обработка с използване на изявление

С JDBC най-простият начин за изпълнение на заявки към база данни е чрез обекта Statement .

Първо, използвайки addBatch (), можем да добавим всички SQL заявки към партида и след това да изпълним тези SQL заявки с помощта на executeBatch () .

Типът на връщане на executeBatch () е масив int, показващ колко записа са били засегнати от изпълнението на всеки SQL оператор.

Нека да видим пример за създаване и изпълнение на партида с помощта на Statement:

Statement statement = connection.createStatement(); statement.addBatch("INSERT INTO EMPLOYEE(ID, NAME, DESIGNATION) " + "VALUES ('1','EmployeeName','Designation')"); statement.addBatch("INSERT INTO EMP_ADDRESS(ID, EMP_ID, ADDRESS) " + "VALUES ('10','1','Address')"); statement.executeBatch(); 

В горния пример се опитваме да вмъкнем записи в таблиците EMPLOYEE и EMP_ADDRESS, използвайки Statement . Можем да видим как се добавят SQL заявки в партидата, която трябва да се изпълни.

3.2. Партидна обработка с помощта на PreparedStatement

PreparedStatement е друг клас, използван за изпълнение на SQL заявки . Той позволява повторно използване на SQL изрази и изисква от нас да задаваме нови параметри за всяка актуализация / вмъкване.

Нека да видим пример с помощта на PreparedStatement. Първо, настройваме изявлението, като използваме SQL заявка, кодирана като низ:

String[] EMPLOYEES = new String[]{"Zuck","Mike","Larry","Musk","Steve"}; String[] DESIGNATIONS = new String[]{"CFO","CSO","CTO","CEO","CMO"}; String insertEmployeeSQL = "INSERT INTO EMPLOYEE(ID, NAME, DESIGNATION) " + "VALUES (?,?,?)"; PreparedStatement employeeStmt = connection.prepareStatement(insertEmployeeSQL);

След това преглеждаме масив от String стойности и добавяме новоконфигурирана заявка към партидата.

След като цикълът приключи, изпълняваме партидата:

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

В примера, показан по-горе, ние вмъкваме записи в таблицата EMPLOYEE, използвайки PreparedStatement. Можем да видим как стойностите за вмъкване се задават в заявката и след това се добавят към партидата, която трябва да се изпълни.

4. Заключение

В тази статия видяхме как груповата обработка на SQL заявките е важна при взаимодействие с бази данни, използвайки JDBC.

Както винаги, кодът, свързан с тази статия, може да бъде намерен в Github.

Дъно на Java

Току що обявих новия курс Learn Spring , фокусиран върху основите на Spring 5 и Spring Boot 2:

>> ПРЕГЛЕД НА КУРСА