jdbc batch processing
Ten samouczek zapewnia pełne zrozumienie przetwarzania wsadowego JDBC i procedury składowanej w języku Java z przykładowymi przykładami języka Java:
w Obsługa wyjątków JDBC samouczek Seria samouczków JDBC , nauczyliśmy się obsługi wyjątków SQL na przykładach programowania.
W tym samouczku omówimy metody przetwarzania wsadowego w Javie przy użyciu sterownika JDBC. Dowiemy się również, jak tworzyć procedury składowane i wywoływać je z programu Java.
Zacznijmy od zrozumienia przetwarzania wsadowego i jego zalet.
Czego się nauczysz:
Przetwarzanie wsadowe JDBC
Jest to proces wykonywania kilku instrukcji SQL w jednej transakcji. Ten proces skraca czas komunikacji i zwiększa wydajność. To znacznie ułatwia przetwarzanie dużej ilości danych.
Zalety przetwarzania wsadowego
Przetwarzanie wsadowe ma na celu poprawę wydajności i spójności danych.
Występ
Rozważmy scenariusz, w którym wiele (powiedzmy 5) wpisów ma zostać dodanych do tabeli z programu JAVA. Prostym podejściem będzie otwarcie połączenia z bazą danych, napisanie zapytań INSERT i wykonanie każdego zapytania przy użyciu instrukcji lub PreparedStatement.
Takie podejście zwiększy liczbę podróży sieciowych do bazy danych, aw rezultacie doprowadzi do słabej wydajności. Korzystając z przetwarzania wsadowego, możemy wykonać tę operację w jednym wywołaniu.
Spójność danych
W niektórych przypadkach musimy wstawiać / aktualizować dane w wielu tabelach. Doprowadzi to do wzajemnie powiązanej transakcji, w której ważna jest sekwencja wstawianych lub aktualizowanych zapytań. Wszelkie błędy, które wystąpią podczas wykonywania, spowodują wycofanie danych wstawionych przez poprzednie zapytania, jeśli takie istnieją.
Przykład:
# 1) Tabela „EMPLOYEE_DETAILS” ma 3 kolumny: ID , Nazwa , i Rola pracownika.
statement.execute('INSERT INTO EMPLOYEE_DETAILS(ID, NAME, ROLE) ' + 'VALUES ('1','EMPLOYEE_NAME1','ROLE1')');
#dwa) Tabela „EMPLOYEE_ADDRESS” ma 2 kolumny: EMP ID i Adres
statement.execute('INSERT INTO EMPLOYEE_ADDRESS( EMP_ID, ADDRESS) ' + 'VALUES ('1','ADDRESS1')');
W powyższym przykładzie może wystąpić problem, gdy pierwsza instrukcja zostanie wykonana pomyślnie, ale druga instrukcja zakończy się niepowodzeniem. W tej sytuacji nie ma wycofania danych wstawionych przez pierwszą instrukcję. Prowadzi to do niespójności danych.
Spójność danych możemy osiągnąć zatwierdzając transakcję na końcu lub dokonując jej wycofania w przypadku jakichkolwiek wyjątków. Ale aby to osiągnąć, DB musi być uderzany wielokrotnie dla każdej instrukcji.
Z drugiej strony, w przetwarzaniu wsadowym, dane zostaną zatwierdzone tylko wtedy, gdy wszystkie zapytania wewnątrz partii zostaną pomyślnie wykonane. W przeciwnym razie tak się nie stanie.
Jak wykonać przetwarzanie wsadowe
Przetwarzanie wsadowe możemy wykonać za pomocą metod addbatch () i executeBatch (), które są dostępne zarówno w klasach Statement, jak i PreparedStatement.
W tym samouczku wszystkie programy są napisane w języku Java. Użyliśmy wersji Java 8 i Oracle DB.
=> Kliknij tutaj, aby pobrać oprogramowanie Oracle
=> Kliknij tutaj, aby pobrać wersję Java 8
W poniższym przykładzie zobaczymy, jak przeprowadzić szczegółowe przetwarzanie wsadowe. Posiada proces instalacji Java krok po kroku.
Dane w tabeli PRACOWNIK przed wprowadzeniem danych:
szablon raportu podsumowującego test w programie Excel
Program 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();} } }
WYNIK:
Dane w Tabeli PRACOWNIK po wprowadzeniu danych:
Wyjaśnienie:
W powyższym programie umieściliśmy dane 3 pracowników w jednej rozmowie z wykorzystaniem operacji wsadowej.
- Utwórz jedno zapytanie wstawiające, aby przekazać wartości kolumn.
- Otwórz połączenie i utwórz obiekt readyStatement przy użyciu obiektu connection i wywołaj metodę replaceStatement.
- Następnie ustaw wartości dla 1śwpracownika za pomocą metod setXXX i wywołaj metodę addBatch (), aby dodać nowy wiersz w partii.
- W ten sposób dodaj wartości 2ndi 3r & Dpracowników. Po dodaniu zapytań do metody addBatch () powinniśmy wywołać metodę executeBatch () za pomocą obiektu readyStatement.
- Metoda executeBatch () wstawia dane 3 pracowników w jednym wywołaniu.
- Sprawdź tabelę EMPLOYEE, czy dane zostały wprowadzone poprawnie, czy nie.
Procedury składowane Java
Procedura składowana to grupa instrukcji SQL, które tworzą pojedynczą jednostkę i wykonują określone zadanie. Będą używane do wykonywania zestawu operacji lub pytań do wykonania na serwerze bazy danych. Można go skompilować i wykonać z różnymi parametrami i wynikami.
Każda procedura ma swoją unikalną nazwę, do której należy się odnosić. Ta jednostka podprogramu jest przechowywana jako obiekt bazy danych w DB.
Podprogram to nic innego jak procedura i powinien być tworzony ręcznie tak, jak chcemy i przechowywać go jako obiekt DB.
Procedury składowane to samodzielne bloki programu, które możemy przechowywać w bazie danych. Używając nazwy procedury składowanej, możemy ją wywołać i wykonać. Służy głównie do wykonywania procesów w PL / SQL. Procedura może mieć zagnieżdżone bloki lub może być zagnieżdżona wewnątrz innych bloków.
Procedura składowana składa się z 3 części:
- Część deklaracji (opcjonalnie): W tej części możemy zadeklarować zmienne, stałe, kursory itp. Jest to część opcjonalna. W oparciu o wymagania możemy z niego korzystać.
- Część wykonawcza: Ta część zawiera główną logikę biznesową procedury. Zwykle będzie zawierał blok instrukcji SQL.
- Wyjątkowa część obsługi (opcjonalnie): W tej części możemy obsłużyć wyjątek, który może wystąpić z powodu kodu części wykonania. Jest to również opcjonalne.
Na podstawie wymagań możemy stworzyć procedurę. Możemy przekazać lub pobrać wartości z parametrów.
W procedurach składowanych dostępne są trzy typy parametrów. Oni są:
- W: Służy do przekazywania wartości wejściowej do procedury składowanej. Procedura składowana użyje parametru wejściowego w programie jako zmiennej tylko do odczytu. Wartości nie można zmienić wewnątrz podprogramów. Oracle używa IN jako domyślnego trybu parametru. Jest to parametr domyślny.
- NA ZEWNĄTRZ: Służy do zwracania lub pobierania wartości z procedury składowanej po wykonaniu. Jest to zmienna do odczytu i zapisu wewnątrz podprogramów. Wartość można zmienić wewnątrz podprogramów.
- WEJŚCIE / WYJŚCIE: Służy do przekazywania wartości wejściowych do procedury składowanej i zwracania lub pobierania wartości również z procedury. Jest czytelny i zapisywalny. Możemy to czytać i modyfikować.
POWRÓT
Użyjemy słowa kluczowego return, aby przekazać kontrolę z powrotem do programu głównego, takiego jak program Java. Gdy procedura znajdzie słowo kluczowe RETURN, zakończy wykonywanie i pominie kod lub instrukcję po nim.
Jak wywołać procedurę składowaną z języka Java
Mamy interfejs CallableStatement w Javie do wywołania procedury składowanej. Obiekt interfejsu CallableStatement można utworzyć za pomocą metody readyCall () interfejsu Connection, a następnie wywołać metodę executeQuery () w celu wykonania procedury składowanej w programie Java.
Przed napisaniem programu w Javie, który to zaimplementuje, powinniśmy stworzyć procedury składowane, aby używać go w programie.
Poniżej przedstawiono składnię wywoływania procedur składowanych w programie Java:
Składnia | Liczba parametrów |
---|---|
{zadzwoń PROCEDURE_NAME ()} | Brak parametrów wejściowych i wyjściowych |
{zadzwoń PROCEDURE_NAME (?,?,?)} | Trzy parametry wejściowe i brak parametrów wyjściowych |
{? = zadzwoń PROCEDURE_NAME ()} | Brak parametrów wejściowych i jeden parametr wyjściowy (wartość ZWRACANA) |
{? = zadzwoń PROCEDURE_NAME (?,?)} | Dwa parametry wejściowe i jeden parametr wyjściowy (wartość ZWRACANA) |
Kroki tworzenia procedur składowanych
# 1) Utwórz procedurę na serwerze DB. Tutaj używamy Oracle DB.
# 2) Składnia tworzenia pełnej procedury:
Możemy również napisać procedurę składowaną w kodzie Java.
# 3) Przekaż parametry IN i OUT, aby użyć ich w procedurze.
# 4) Należy wspomnieć o słowie kluczowym AS / IS. Jeśli dodajemy inną procedurę do nowej procedury, użyj słowa kluczowego IS lub słowa kluczowego AS, jeśli procedura jest samodzielna.
# 5) Zadeklaruj zmienne, nie jest to obowiązkowe, w oparciu o wymaganie, które możemy stworzyć.
# 6) Następnie ROZPOCZNIJ procedurę za pomocą słowa kluczowego BEGIN, a następnie napisz instrukcje SQL lub zapytania, które mają być wykonane w procedurze.
# 7) Następnie możemy obsłużyć wyjątek w części Exception. Nie jest to również obowiązkowe.
# 8) Zakończ procedurę, podając słowo kluczowe END i nazwę procedury.
Możemy utworzyć procedurę w Oracle i zapisać ją pod unikalną nazwą i wywołać tę procedurę z programu Java. Możemy stworzyć procedurę i wywołać ją również w Javie.
Utwórz procedurę w Oracle, zapisz ją i wywołaj procedurę w programie Java.
# 1) Otwórz serwer bazy danych. Tutaj używamy serwera Oracle DB.
#dwa) Kliknij prawym przyciskiem myszy folder Procedura i kliknij opcję Nowa procedura.
# 3) Zapyta o nazwę procedury i szczegóły parametrów.
pl sql wywiad pytania i odpowiedzi
Uwaga: Szczegóły parametrów możemy podać również podczas pisania procedury.
# 4) Napisz procedurę, korzystając z kroków, które omówiliśmy już w tym samouczku, i zapisz procedurę pod unikalną nazwą.
Procedura na zrzucie ekranu wyświetli dane wyjściowe w DB. Możemy to zmienić, aby wyświetlić go również w programie Java. W tym celu musimy użyć parametrów OUT.
# 5) Uruchom procedurę, klikając przycisk Uruchom
# 6) Wprowadź wartość w kolumnie Wartość wejściowa. Wyświetli dane dla podanej wartości.
Do tej pory widzieliśmy, jak utworzyć i wykonać procedurę w samej konsoli DB.
Utwórz procedurę w DB. Wywołaj go i wyświetl dane w konsoli Java .
Utwórz następującą procedurę, wykonując powyższe kroki i zapisz ją pod nazwą „DISPLAY_EMPLOYEE_DETAILS”.
Przykładowy program procedury składowanej w języku 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(); } } }
WYNIK:
Wyjaśnienie:
W powyższym programie stworzyliśmy jedną procedurę i zapisaliśmy ją w Oracle DB. Następnie wywołał tę procedurę za pomocą CallableStatement i wyświetlił dane w konsoli Java.
- Utwórz procedurę i zapisz ją w Oracle DB.
- W programie Java otwórz połączenie z bazą danych i wywołaj metodę readyCall, używając obiektów connection i CallableStatement.
- Przekaż wartość parametru wejściowego za pomocą metody setXXX.
- Pobierz wartości parametrów wyjściowych za pomocą metody registerOutParameter. W tej metodzie powinniśmy przekazać wartość indeksu parametru i typ danych parametru. Będzie przechowywać wartości w indeksie parametrów.
- Korzystając z metod getXXX możemy pobrać dane i wyświetlić je w konsoli Java.
Utwórz procedurę i wykonaj ją w samym programie Java.
Program 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(); } } }
WYNIK:
Dane w tabeli Employee_details przed uruchomieniem programu:
Dane w tabeli Employee_details po wykonaniu programu:
Wyjaśnienie:
W powyższym programie przechowujemy kod procedury jako ciąg.
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;
';
- Otwórz połączenie Oracle DB i utwórz obiekt instrukcji przy użyciu obiektu połączenia.
- Wywołaj metodę createStatement za pomocą obiektu instrukcji, ponieważ tworzymy procedurę w kodzie Java.
- Wywołaj procedurę, używając składni {zadzwoń pod numer UPD_EMPLOYEE_DETAILS (?,?) to readyCall metody CallableStatement.
- Ponieważ tworzymy procedurę w kodzie Java, musimy wykonać ten „Utwórz kod procedury”.
- Aby wykonać tę procedurę, wywołaj metodę execute przy użyciu obiektu instrukcji „ stmt.execute (Stored_Procedure) ”. Spowoduje to tymczasowe utworzenie procedury w bazie danych.
- Zakres procedury to zakończenie realizacji programu. Potem nie będzie dostępny. Używając metod setXXX, ustaw wartości do zaktualizowania w tabeli Employee_Details.
- Wywołaj metodę executeUpdate przy użyciu obiektu callableStatement. Ta metoda zaktualizuje wartości w opowieści Empoyee_Details.
- Sprawdź tabelę Employee_details, czy dane zostały poprawnie zaktualizowane.
Punkty do zapamiętania:
- Przetwarzanie wsadowe poprawia wydajność i zachowuje spójność danych.
- Wykonywanie kilku instrukcji SQL w jednej transakcji nazywane jest przetwarzaniem wsadowym.
- Procedura składowana to blok instrukcji SQL używany do wykonywania logiki biznesowej.
- Możemy przekazać parametr wejściowy za pomocą słowa kluczowego IN do procedury i słowa kluczowego OUT dla parametru wyjściowego.
- Możemy stworzyć procedurę w samym serwerze DB i tymczasowo również użyć kodu Java.
Często Zadawane Pytania
P # 1) Który interfejs powinien być używany do przetwarzania wsadowego w JDBC?
Odpowiedź: Pakiet Java ma interfejsy Statement i PreparedStatement, które udostępniają metody przetwarzania wsadowego.
Pytanie 2) Jak działają aktualizacje wsadowe w JDBC?
Odpowiedź: Aktualizacja wsadowa JDBC to zbiór aktualizacji zgrupowanych i wysłanych do bazy danych za jednym razem, zamiast wysyłania aktualizacji pojedynczo. W ten sposób zmniejsza ruch sieciowy w bazie danych.
P # 3) W jaki sposób przetwarzanie wsadowe zwiększa wydajność?
Odpowiedź: Przetwarzanie wsadowe wysyła dane do bazy danych jednocześnie (tylko 1 podróż w obie strony), zamiast wysyłać je pojedynczo, a baza danych może być w stanie wykonywać niektóre instrukcje równolegle. W ten sposób zwiększa wydajność aplikacji i oszczędza czas.
P # 4) Jakie parametry są akceptowane w procedurach składowanych w JDBC?
Odpowiedź: Istnieją trzy typy parametrów - IN, OUT i INOUT. Parametr IN służy do uzyskania wartości wejściowej. Parametr OUT służy do pobierania wartości wyjściowej. Parametr INOUT jest używany zarówno dla wejścia, jak i wyjścia.
P # 5) Jakie są dostępne metody wykonywania procedury składowanej w JDBC?
Odpowiedź: Korzystając z interfejsu CallableStatement, możemy wywołać procedurę. Interfejs CallableStatement udostępnia trzy metody wykonywania procedur składowanych.
Te trzy metody to:
- executeUpdate (): Użyj tej metody, jeśli procedura nie zwraca żadnych wartości.
- executeQuery (): Użyj tej metody, jeśli procedura zwraca tylko jeden zestaw wyników.
- wykonać(): Użyj tej metody, jeśli procedura zwraca wiele zestawów wyników lub nieznaną liczbę zestawów wyników.
Wniosek
W tym samouczku omówiliśmy przetwarzanie wsadowe i procedury składowane. We współczesnym świecie wysoka wydajność, spójność danych i możliwość ponownego wykorzystania to modne hasła dla każdej popularnej aplikacji. Zarówno przetwarzanie wsadowe, jak i procedury składowane odgrywają bardzo ważną rolę we wdrażaniu tych funkcji. Znajomość tych zagadnień jest nieunikniona dla każdego inżyniera oprogramowania.
rekomendowane lektury
- Samouczek Java JDBC: Co to jest JDBC (łączność z bazą danych Java)
- Samouczek dotyczący połączeń JDBC w języku Java z przykładem programowania
- Zarządzanie transakcjami Java JDBC z przykładem
- JDBC ResultSet: jak używać Java ResultSet do pobierania danych
- Obsługa wyjątków JDBC - jak obsługiwać wyjątki SQL
- JDBC DriverManager, JDBC PreparedStatement And Statement
- Samouczek JAVA dla początkujących: ponad 100 praktycznych samouczków wideo Java