jdbc batch processing
Този урок предоставя пълно разбиране на JDBC пакетната обработка и съхранената процедура в Java с примерни примери за Java:
В Обработка на изключения JDBC урок на JDBC серия уроци , научихме начини за справяне с SQL изключения с помощта на примери за програмиране.
В този урок ще обсъдим методи за групова обработка в Java с помощта на JDBC драйвер. Също така ще научим как да създаваме съхранени процедури и да го извикваме от програма Java.
Нека започнем с разбирането на партидната обработка и нейните предимства.
Какво ще научите:
Пакетна обработка на JDBC
Това е процесът на изпълнение на няколко SQL израза в една транзакция. Този процес намалява времето за комуникация и увеличава производителността. Това прави обработката на голямо количество данни много по-лесна.
Предимства на партидната обработка
Партидната обработка има за цел подобряване на производителността и последователността на данните.
производителност
Помислете за сценария, при който в таблица от програма JAVA трябва да бъдат добавени множество (да речем 5) записа. Простият подход ще бъде отваряне на връзка с базата данни, писане на INSERT заявки и изпълнение на всяка заявка с помощта на Statement или PreparedStatement.
Този подход ще увеличи мрежовите пътувания до базата данни и в резултат ще доведе до лоша производителност. Използвайки групова обработка, можем да извършим тази операция с едно обаждане.
Последователност на данните
В някои случаи трябва да вмъкнем / актуализираме данни в множество таблици. Това ще доведе до взаимосвързана транзакция, при която е важна последователността от вмъкнати или актуализирани заявки. Всички грешки, възникнали по време на изпълнение, биха довели до връщане на данните, вмъкнати от предишни заявки, ако има такива.
Пример:
# 1) Таблица ‘EMPLOYEE_DETAILS’ има 3 колони: документ за самоличност , Име , и Роля на служителя.
statement.execute('INSERT INTO EMPLOYEE_DETAILS(ID, NAME, ROLE) ' + 'VALUES ('1','EMPLOYEE_NAME1','ROLE1')');
# две) Таблица „EMPLOYEE_ADDRESS“ има 2 колони: EMP ID и Адрес
statement.execute('INSERT INTO EMPLOYEE_ADDRESS( EMP_ID, ADDRESS) ' + 'VALUES ('1','ADDRESS1')');
В горния пример може да възникне проблем, когато първият оператор се изпълнява успешно, но вторият оператор се проваля. В тази ситуация няма връщане на данните, вмъкнати от първия оператор. Това води до несъответствие на данните.
Можем да постигнем съгласуваност на данните, като извършим транзакцията в края или извършим възстановяване в случай на изключения. Но, за да се постигне това, DB трябва да бъде удрян многократно за всяко изявление.
От друга страна, при груповата обработка, само когато всички заявки в дадена партида се изпълнят успешно, данните ще бъдат ангажирани. В противен случай няма.
Как да извършите групова обработка
Можем да извършим групова обработка, като използваме методите addbatch () и executeBatch (), които са налични както в класовете Statement, така и в PreparedStatement.
В този урок всички програми са написани на Java. Използвали сме версия на Java 8 и Oracle DB.
=> Щракнете тук, за да изтеглите софтуера Oracle
=> Щракнете тук, за да изтеглите Java версия 8
В следващия пример ще видим как да извършим сложна обработка на партиди. Той има стъпка по стъпка процес на инсталиране на Java.
Данни в таблицата EMPLOYEE преди вмъкване на данни:
как да използвам сървъра на фондация на екип
Програма 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();} } }
ИЗХОД:
Данни в EMPLOYEE таблица след вмъкване на данните:
Обяснение:
В горната програма вмъкнахме данни за 3 служители в едно обаждане, използвайки пакетна операция.
- Създайте една заявка за вмъкване, за да предадете стойностите на колоната.
- Отворете връзката и създайте обект подготвен Statement с помощта на обект на свързване и извикайте метода prepaStatement.
- След това задайте стойностите за 1улслужител, използващ методите setXXX и извикайте метода addBatch (), за да добавите новия ред в партидата.
- По този начин добавете стойностите за 2ndи 3rdслужители. След добавяне на заявките в метода addBatch (), трябва да извикаме метода executeBatch (), като използваме обекта PrepaStatement.
- Методът executeBatch () вмъква данните на 3 служители в едно обаждане.
- Проверете таблицата EMPLOYEE дали данните са вмъкнати правилно или не.
Процедури, съхранени в Java
Съхранената процедура е група от SQL изрази, които образуват една единица и изпълняват определена задача. Те ще бъдат използвани за извършване на набор от операции или въпроси за изпълнение на сървър на база данни. Може да се компилира и изпълнява с различни параметри и резултати.
Всяка процедура има своето уникално име, на което да се позовава. Тази подпрограмна единица се съхранява като обект на база данни в DB.
Подпрограмата не е нищо друго освен процедура и тя трябва да бъде създадена ръчно, както искаме, и да я съхранява като DB обект.
Съхранените процедури са самостоятелни блокове на програма, които можем да съхраняваме в DB. Използвайки името на съхранената процедура, можем да я извикаме и изпълним. Използва се главно за изпълнение на процес в PL / SQL. Процедурата може да има вложени блокове или може да бъде вложена вътре в другите блокове.
Съхранената процедура има 3 части:
- Част за декларация (по избор): В тази част можем да декларираме променливите, константите, курсорите и т.н., Това е незадължителна част. Въз основа на изискванията можем да го използваме.
- Изпълнителна част: Тази част съдържа основната бизнес логика на процедурата. Обикновено ще има блок от SQL изрази.
- Изключителна обработваща част (по избор): В тази част можем да се справим с изключението, което може да възникне поради кода на частта за изпълнение. Освен това е по избор.
Въз основа на изискванията можем да създадем процедура. Можем да предадем или извлечем стойностите от параметрите.
В съхранените процедури има три типа параметри. Те са:
- IN: Използва се за предаване на входната стойност на съхранената процедура. Съхранената процедура ще използва входния параметър в програмата като променлива само за четене. Стойността не може да бъде променена в подпрограмите. Oracle използва IN като режим по подразбиране на параметъра. Това е параметърът по подразбиране.
- ВЪН: Използва се за връщане или получаване на стойността от съхранената процедура след изпълнението. Това е променлива за четене и запис в подпрограмите. Стойността може да се променя в рамките на подпрограмите.
- ВХОД / ИЗХОД: Използва се за предаване на входните стойности на съхранената процедура и връщане или получаване на стойностите и от процедурата. Той е както четим, така и за запис. Можем да го четем и модифицираме.
ВРЪЩАНЕ
Ще използваме ключовата дума return, за да върнем контрола на основната програма, като програмата Java. Когато процедурата намери ключовата дума RETURN, тя ще излезе от изпълнението и ще пропусне кода или израза след него.
Как да се обадя на съхранена процедура от Java
Имаме интерфейс CallableStatement в Java, за да извикаме Съхранена процедура. Обектът на интерфейса CallableStatement може да бъде създаден с помощта на метода prepaCall () на интерфейса Connection и след това трябва да извикаме метода executeQuery (), за да изпълним съхранената процедура в програмата Java.
Преди да напишем програмата Java, за да приложим това, трябва да създадем съхранени процедури, за да я използваме в програмата.
По-долу е синтаксисът за извикване на съхранени процедури в програмата Java:
Синтаксис | Брой параметри |
---|---|
{обадете се на PROCEDURE_NAME ()} | Без входни параметри и без изходни параметри |
{обадете се на PROCEDURE_NAME (?,?,?)} | Три входни параметъра и никакви изходни параметри |
{? = обадете се на PROCEDURE_NAME ()} | Няма входни параметри и един изходен параметър (RETURN стойност) |
{? = обадете се на PROCEDURE_NAME (?,?)} | Два входни параметъра и един изходен параметър (RETURN стойност) |
Стъпки за създаване на съхранени процедури
# 1) Създайте процедурата в DB сървъра. Тук използваме Oracle DB.
# 2) Синтаксис за създаване на пълна процедура:
Можем да запишем съхранената процедура и в Java код.
# 3) Предайте параметрите IN и OUT, за да ги използвате в процедурата.
# 4) Трябва да се спомене ключова дума AS / IS. Ако добавяме друга процедура в новата процедура, използвайте ключовата дума IS или иначе AS ключова дума, ако процедурата е самостоятелна.
# 5) Декларирайте променливите, това не е задължително въз основа на изискването, което можем да създадем.
# 6) След това НАЧНЕТЕ процедурата с помощта на ключовата дума BEGIN и след това напишете SQL изразите или заявките, които трябва да бъдат изпълнени в процедурата.
# 7) След това можем да се справим с изключението в частта за изключения. Също така не е задължително да се споменава.
# 8) Завършете процедурата, като споменете ключовата дума END и името на процедурата.
Можем да създадем процедурата в Oracle и да я запазим с уникално име и да извикаме тази процедура от програмата Java. Можем да създадем процедурата и да я извикаме и в Java.
Създайте процедура в Oracle, запазете я и извикайте процедурата в Java Program.
# 1) Отворете сървъра на базата данни. Тук използваме сървъра на Oracle DB.
# две) Щракнете с десния бутон върху папката „Процедура“ и щракнете върху опцията „Нова процедура“.
# 3) Той ще поиска името на процедурата и подробностите за параметъра.
какъв е моят ключ за сигурност в интернет
Забележка: Можем да дадем подробности за параметъра, докато пишем и процедурата.
# 4) Напишете процедурата, като използвате стъпките, които вече обсъдихме в този урок, и запазете процедурата с уникалното име.
Процедурата на екранната снимка ще покаже изхода в DB. Можем да го променим, за да го покажем и в програмата Java. За това трябва да използваме OUT параметри.
# 5) Изпълнете процедурата, като щракнете върху бутона за изпълнение
# 6) Въведете стойността в колоната Input Value. Той ще покаже данните за дадената стойност.
Досега видяхме как да създадем и изпълним процедурата в самата конзола на DB.
Създайте процедурата в DB. Обадете се и покажете данните в Java конзолата .
Създайте следната процедура, като използвате горните стъпки и я запазете с името „DISPLAY_EMPLOYEE_DETAILS“.
Примерна програма за съхранена процедура в 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(); } } }
ИЗХОД:
Обяснение:
В горната програма това, което направихме, е, че създадохме една процедура и я запазихме в Oracle DB. След това извика тази процедура с помощта на CallableStatement и показа данните в Java Console.
- Създайте процедурата и я запазете в Oracle DB.
- В програмата Java отворете DB връзката и извикайте метода prepaCall, като използвате обектите за връзка и CallableStatement.
- Предайте стойността на входния параметър, използвайки метода setXXX.
- Извличане на стойностите на изходните параметри с помощта на метода registerOutParameter. В този метод трябва да предадем стойността на индекса на параметъра и типа данни на параметъра. Той ще съхранява стойностите в индекса на параметрите.
- Използвайки методите getXXX, можем да извлечем данните и да ги покажем в Java конзолата.
Създайте процедурата и я изпълнете в самата програма Java.
Програма 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(); } } }
ИЗХОД:
Данни в таблицата Employee_details преди изпълнението на програмата:
Данни в таблицата Employee_details след изпълнението на програмата:
Обяснение:
В горната програма съхраняваме кода на процедурата като низ.
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;
';
- Отворете Oracle DB Connection и създайте операторния обект, използвайки обекта за свързване.
- Извикайте метода createStatement, използвайки операторски обект, защото ние създаваме процедурата в Java код.
- Извикайте процедурата, като използвате синтаксиса {обадете се UPD_EMPLOYEE_DETAILS (?,?) да се подготви метод Call на CallableStatement.
- Тъй като създаваме процедурата в Java код, трябва да изпълним този „Създаване на код на процедурата“.
- За да изпълните тази процедура, извикайте метода за изпълнение с помощта на Statement обект “ stmt.execute (Stored_Procedure) ”. Това ще създаде процедурата временно в DB.
- Обхватът на процедурата е края на изпълнението на програмата. След това няма да е налице. Използвайки методите setXXX, задайте стойностите за актуализиране в таблицата Employee_Details.
- Извикайте метода executeUpdate, като използвате обект callableStatement. Този метод ще актуализира стойностите в приказката Empoyee_Details.
- Проверете таблицата Employee_details дали данните са актуализирани правилно.
Точки за запомняне:
- Партидната обработка подобрява производителността и поддържа последователността на данните.
- Изпълнението на няколко SQL израза в една транзакция е известно като групова обработка.
- Съхранена процедура е блокът от SQL изрази, използван за изпълнение на бизнес логика.
- Можем да предадем входния параметър с помощта на ключова дума IN на процедурата и ключовата дума OUT за изходния параметър.
- Можем да създадем процедура в самия DB сървър и временно да използваме и Java код.
често задавани въпроси
В # 1) Кой интерфейс трябва да се използва за извършване на групова обработка в JDBC?
Отговор: Пакетът Java има интерфейси Statement и PreparedStatement, които предоставят методите за групова обработка.
В # 2) Как работят пакетните актуализации в JDBC?
Отговор: Пакетната актуализация на JDBC е група актуализации, групирани и изпратени до базата данни наведнъж, вместо да изпращате актуализациите една по една. По този начин намалява мрежовия трафик в базата данни.
В # 3) Как пакетната обработка увеличава производителността?
Отговор: Груповата обработка изпраща данните към Базата данни наведнъж (само 1 двупосочно пътуване), вместо да изпраща един по един, и Базата данни може да може да изпълнява паралелно някои изрази. По този начин увеличава производителността на приложението и спестява време.
В # 4) Какви са параметрите, приети в съхранените процедури в JDBC?
Отговор: Има три типа параметри - IN, OUT и INOUT параметри. Параметърът IN е да получите входната стойност. Параметърът OUT е за извличане на изходната стойност. Параметърът INOUT се използва както за вход, така и за изход.
В # 5) Какви са наличните методи за изпълнение на съхранена процедура в JDBC?
Отговор: Използвайки CallableStatement Interface, можем да извикаме процедурата. Интерфейсът CallableStatement предоставя три метода за изпълнение на съхранените процедури.
Трите метода са:
- executeUpdate (): Използвайте този метод, ако процедурата не връща никакви върнати стойности.
- executeQuery (): Използвайте този метод, ако процедурата връща само един набор от резултати.
- изпълни(): Използвайте този метод, ако процедурата връща много набори от резултати или неизвестен брой набори от резултати.
Заключение
В този урок разгледахме пакетната обработка и съхранените процедури. В съвременния свят високата производителност, последователността на данните и повторната употреба са ключовите думи за всяко популярно приложение. Както груповата обработка, така и съхранените процедури играят много важна роля за внедряването на тези функции. Познаването на тях е неизбежно за всеки софтуерен инженер.
Препоръчително четене
- Урок за Java JDBC: Какво е JDBC (свързаност с база данни на Java)
- Урок за свързване на Java JDBC с пример за програмиране
- Управление на транзакции на Java JDBC с пример
- JDBC ResultSet: Как да използвам Java ResultSet за извличане на данни
- Обработка на изключения JDBC - Как да се справя с SQL изключенията
- JDBC DriverManager, JDBC PreparedStatement and Statement
- Урок за JAVA за начинаещи: 100+ практически ръководства за Java видео