jdbc batch processing
Bu eğitim, örnek Java örnekleriyle birlikte JDBC Toplu İşleme ve Java Depolanan Prosedürünün tam olarak anlaşılmasını sağlar:
İçinde JDBC Özel Durum İşleme öğreticisi JDBC eğitim serisi , programlama örnekleri yardımıyla SQL İstisnalarını ele almanın yollarını öğrendik.
Bu eğitimde, JDBC sürücüsünü kullanarak Java'da toplu işlem yapma yöntemlerini tartışacağız. Ayrıca saklı yordamların nasıl oluşturulacağını ve bir Java programından nasıl çağırılacağını öğreneceğiz.
Toplu işlemeyi ve avantajlarını anlamakla başlayalım.
Ne öğreneceksin:
JDBC Toplu İşleme
Bu, bir işlemde birkaç SQL ifadesinin yürütülmesi sürecidir. Bu süreç iletişim süresini azaltır ve performansı artırır. Büyük miktarda veriyi işlemeyi çok daha kolay hale getirir.
Toplu İşlemenin Avantajları
Toplu İşleme, performansı ve veri tutarlılığını iyileştirmeyi amaçlar.
Verim
Bir JAVA programından bir tabloya birden çok (5 diyelim) girişin ekleneceği senaryoyu düşünün. Basit yaklaşım, veritabanına bir bağlantı açmak, INSERT sorguları yazmak ve her sorguyu Statement veya PreparedStatement kullanarak yürütmek olacaktır.
Bu yaklaşım, veritabanına yapılan ağ gezilerini artıracak ve sonuç olarak düşük performansa yol açacaktır. Toplu işlemeyi kullanarak bu işlemi tek bir aramada gerçekleştirebiliriz.
Veri tutarlılığı
Bazı durumlarda, verileri birden çok tabloya eklememiz / güncellememiz gerekir. Bu, eklenen veya güncellenen sorgu dizisinin önemli olduğu birbiriyle ilişkili bir işleme yol açacaktır. Yürütme sırasında meydana gelen herhangi bir hata, varsa önceki sorgular tarafından eklenen verilerin geri alınmasına neden olur.
Misal:
# 1) 'EMPLOYEE_DETAILS' tablosunda 3 sütun var: İD , İsim , ve Çalışanın rolü.
statement.execute('INSERT INTO EMPLOYEE_DETAILS(ID, NAME, ROLE) ' + 'VALUES ('1','EMPLOYEE_NAME1','ROLE1')');
#iki) 'EMPLOYEE_ADDRESS' tablosunda 2 sütun var: EMP Kimliği ve Adres
statement.execute('INSERT INTO EMPLOYEE_ADDRESS( EMP_ID, ADDRESS) ' + 'VALUES ('1','ADDRESS1')');
Yukarıdaki örnekte, ilk ifade başarıyla yürütüldüğünde, ancak ikinci ifade başarısız olduğunda bir sorun ortaya çıkabilir. Bu durumda, ilk ifade tarafından eklenen verilerin geri dönüşü yoktur. Bu, veri tutarsızlığına yol açar.
Herhangi bir istisna durumunda işlemi sonunda taahhüt ederek veya geri alma gerçekleştirerek veri tutarlılığı sağlayabiliriz. Ancak, bunu başarmak için DB'nin her ifadede tekrar tekrar vurulması gerekir.
Öte yandan, toplu işlemede, yalnızca bir toplu iş içindeki tüm sorgular başarılı bir şekilde yürütüldüğünde veriler işlenir. Aksi takdirde, olmayacak.
Toplu İşleme Nasıl Gerçekleştirilir
Hem Statement hem de PreparedStatement sınıflarında bulunan addbatch () ve executeBatch () yöntemlerini kullanarak toplu işlem gerçekleştirebiliriz.
Bu eğitimde, tüm programlar Java ile yazılmıştır. Java 8 sürümünü ve Oracle DB'yi kullandık.
=> Oracle yazılımını indirmek için burayı tıklayın
=> Java sürüm 8'i indirmek için burayı tıklayın
Aşağıdaki örnekte, toplu işlemeyi ayrıntılı bir şekilde nasıl yapacağımızı göreceğiz. Adım adım Java kurulum sürecine sahiptir.
Verileri eklemeden önce ÇALIŞAN tablosundaki veriler:
.bin dosyası nasıl açılır pencereler 10
Java Programı
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();} } }
ÇIKTI:
Verilerin eklenmesinden sonra ÇALIŞAN Tablosundaki veriler:
Açıklama:
Yukarıdaki programda, toplu işlemi kullanarak 3 çalışanın verilerini bir aramaya ekledik.
- Sütun değerlerini iletmek için bir ekleme sorgusu oluşturun.
- Bağlantıyı açın ve bağlantı nesnesini kullanarak bir readyStatement nesnesi oluşturun ve readyStatement yöntemini çağırın.
- Ardından 1 için değerleri ayarlayınstsetXXX yöntemlerini kullanarak çalışan ve toplu işleme yeni satırı eklemek için addBatch () yöntemini çağırın.
- Bunun gibi, 2 için değerleri ekleyinndve 3rdçalışanlar. AddBatch () yöntemine sorguları ekledikten sonra, readyStatement nesnesini kullanarak executeBatch () yöntemini çağırmalıyız.
- executeBatch () yöntemi, 3 çalışanın verilerini tek bir çağrıya ekler.
- EMPLOYEE tablosunu verilerin doğru bir şekilde girilip girilmediğini kontrol edin.
Java'da Saklanan Prosedürler
Depolanan Prosedür, tek bir birim oluşturan ve belirli bir görevi gerçekleştiren bir grup SQL deyimidir. Bir veritabanı sunucusunda yürütülecek bir dizi işlemi veya soruyu gerçekleştirmek için kullanılacaklar. Farklı parametreler ve sonuçlarla derlenebilir ve çalıştırılabilir.
Her prosedürün atıfta bulunulacak benzersiz adı vardır. Bu alt program birimi, DB'de bir Veritabanı nesnesi olarak saklanır.
Bir alt program bir prosedürden başka bir şey değildir ve istediğimiz gibi manuel olarak oluşturulmalı ve bir DB nesnesi olarak saklanmalıdır.
Depolanan Prosedürler, DB'de saklayabileceğimiz bir programın bağımsız bloklarıdır. Depolanan prosedürün adını kullanarak onu arayabilir ve çalıştırabiliriz. Esas olarak PL / SQL'de bir işlemi yürütmek için kullanılır. Prosedür iç içe bloklara sahip olabilir veya diğer blokların içinde iç içe olabilir.
Depolanan yordam 3 bölümden oluşur:
- Beyan bölümü (isteğe bağlı): Bu bölümde değişkenleri, sabitleri, imleçleri vb. Tanımlayabiliriz, isteğe bağlı bir kısımdır. Gereksinimlere göre kullanabiliriz.
- Yürütme bölümü: Bu bölüm, prosedürün ana iş mantığını içerir. Normalde bir SQL ifadeleri bloğuna sahip olacaktır.
- Olağanüstü Taşıma parçası (isteğe bağlı): Bu bölümde Yürütme parça kodu nedeniyle oluşabilecek istisnayı ele alabiliriz. Ayrıca isteğe bağlıdır.
Gereksinimlere göre bir prosedür oluşturabiliriz. Değerleri parametrelerden geçirebilir veya alabiliriz.
Depolanan Prosedürlerde kullanılabilen üç tür parametre vardır. Onlar:
- İÇİNDE: Girdi değerini saklı yordama geçirmek için kullanılır. Depolanan yordam, programdaki giriş parametresini salt okunur bir değişken olarak kullanır. Değer, alt programların içinde değiştirilemez. Oracle, parametrenin varsayılan modu olarak IN kullanır. Varsayılan parametredir.
- DIŞARI: Yürütmeden sonra Saklanan Prosedürden değeri döndürmek veya almak için kullanılır. Alt programların içindeki bir okuma-yazma değişkenidir. Değer, alt programların içinde değiştirilebilir.
- GİRİŞ / ÇIKIŞ: Girdi değerlerini saklı yordama geçirmek ve yordamdan değerleri döndürmek veya almak için kullanılır. Hem okunabilir hem de yazılabilir. Okuyabilir ve değiştirebiliriz.
DÖNÜŞ
Java programı gibi ana programa kontrolü geri vermek için return anahtar sözcüğünü kullanacağız. Prosedür RETURN anahtar kelimesini bulduğunda, yürütmeden çıkar ve ondan sonraki kodu veya ifadeyi atlar.
Java'dan Depolanan Prosedür Nasıl Çağırılır
Java'da Stored Procedure'ü çağırmak için CallableStatement arayüzümüz var. CallableStatement arabirim nesnesi, Connection arabiriminin readyCall () yöntemi kullanılarak oluşturulabilir ve bundan sonra, Java programında Stored Procedure'ü yürütmek için executeQuery () yöntemini çağırmalıyız.
Bunu uygulamak için Java programını yazmadan önce, onu programda kullanmak için saklı prosedürler oluşturmalıyız.
Aşağıda, Java programında saklı yordamları çağırmak için kullanılan sözdizimi verilmiştir:
Sözdizimi | Parametre Sayısı |
---|---|
{PROCEDURE_NAME () numaralı telefonu arayın} | Giriş parametresi ve çıkış parametresi yok |
{PROCEDURE_NAME arayın (?,?,?)} | Üç giriş parametresi ve çıkış parametresi yok |
{? = PROCEDURE_NAME () numaralı telefonu arayın} | Giriş parametresi yok ve bir çıkış parametresi (RETURN Değeri) |
{? = PROCEDURE_NAME (?,?)} | İki giriş parametresi ve bir çıkış parametresi (RETURN Değeri) |
Saklanan Prosedürler Oluşturma Adımları
# 1) Yordamı DB sunucusunda oluşturun. Burada Oracle DB kullanıyoruz.
# 2) Tam prosedür oluşturmak için sözdizimi:
Depolanan prosedürü Java kodunda da yazabiliriz.
# 3) Prosedürde kullanmak için GİRİŞ ve ÇIKIŞ parametrelerini iletin.
# 4) AS / IS anahtar sözcüğü belirtilmelidir. Yeni prosedürde başka bir prosedür ekliyorsak, IS anahtar kelimesini veya prosedür bağımsız ise AS anahtar kelimesini kullanın.
# 5) Oluşturabileceğimiz gereksinime bağlı olarak zorunlu değildir, değişkenleri bildirin.
# 6) Daha sonra BEGIN anahtar sözcüğünü kullanarak prosedüre BAŞLAYIN ve ardından prosedürde gerçekleştirilecek SQL ifadelerini veya sorgularını yazın.
# 7) Daha sonra, İstisna bölümünde istisnayı ele alabiliriz. Ayrıca bahsetmek zorunlu değildir.
# 8) END anahtar sözcüğünü ve prosedür adını belirterek prosedürü bitirin.
Prosedürü Oracle'da oluşturup benzersiz bir isimle kaydedip bu prosedürü Java programından çağırabiliriz. Prosedürü oluşturabilir ve bu prosedürü Java'da da çağırabiliriz.
Oracle'da bir prosedür oluşturun, kaydedin ve Java Programında prosedürü çağırın.
# 1) Veritabanı sunucusunu açın. Burada Oracle DB sunucusunu kullanıyoruz.
#iki) Prosedür klasörüne sağ tıklayın ve Yeni Prosedür seçeneğine tıklayın.
# 3) Prosedürün adını ve parametre ayrıntılarını soracaktır.
Not: Prosedürü yazarken de parametre detaylarını verebiliriz.
# 4) Bu eğitimde daha önce tartıştığımız adımları kullanarak prosedürü yazın ve prosedürü benzersiz adla kaydedin.
Ekran görüntüsündeki prosedür çıktıyı DB'de gösterecektir. Bunu Java programında da gösterecek şekilde değiştirebiliriz. Bunun için OUT parametrelerini kullanmamız gerekiyor.
# 5) Çalıştır düğmesine tıklayarak prosedürü çalıştırın
# 6) Değeri Giriş Değeri sütununa girin. Verilen değer için verileri gösterecektir.
Şimdiye kadar, prosedürü DB konsolunun kendisinde nasıl oluşturup yürüteceğimizi gördük.
Prosedürü DB'de oluşturun. Onu arayın ve verileri Java konsolunda görüntüleyin .
Yukarıdaki adımları kullanarak aşağıdaki prosedürü oluşturun ve 'DISPLAY_EMPLOYEE_DETAILS' adıyla kaydedin.
Java Stored Procedure Örnek Programı
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(); } } }
ÇIKTI:
Açıklama:
Yukarıdaki programda yaptığımız şey bir prosedür oluşturduk ve Oracle DB'ye kaydettik. Daha sonra CallableStatement kullanarak bu prosedürü çağırdı ve verileri Java Konsolunda görüntüledi.
- Prosedürü oluşturun ve Oracle DB'ye kaydedin.
- Java programında, DB bağlantısını açın ve bağlantıyı ve CallableStatement nesnelerini kullanarak readyCall yöntemini çağırın.
- SetXXX yöntemini kullanarak giriş parametresi değerini iletin.
- RegisterOutParameter yöntemini kullanarak çıkış parametresi değerlerini alın. Bu yöntemde parametre indeks değerini ve parametrenin veri tipini geçmeliyiz. Değerleri parametre dizininde saklayacaktır.
- GetXXX yöntemlerini kullanarak verileri alabilir ve Java konsolunda görüntüleyebiliriz.
Prosedürü oluşturun ve Java programının kendisinde yürütün.
pc için boş zaman saati uygulaması
Java Programı
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(); } } }
ÇIKTI:
Programın yürütülmesinden önce Employee_details tablosundaki veriler:
Programın çalıştırılmasından sonra Employee_details tablosundaki veriler:
Açıklama:
Yukarıdaki programda, prosedür kodunu bir dizge olarak saklıyoruz.
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'ı açın ve bağlantı nesnesini kullanarak ifade nesnesini oluşturun.
- Java kodunda yordamı oluşturduğumuz için createStatement yöntemini ifade nesnesini kullanarak çağırın.
- Sözdizimini kullanarak prosedürü çağırın {UPD_EMPLOYEE_DETAILS'i arayın (?,?) CallableStatement'inCall yöntemini hazırlamak için.
- Prosedürü Java kodunda oluşturduğumuz için, bu 'Prosedür Kodu Oluştur' u çalıştırmalıyız.
- Bu prosedürü yürütmek için, 'Statement' nesnesini kullanarak execute yöntemini çağırın. stmt.execute (Stored_Procedure) ”. Bu, prosedürü geçici olarak DB'de yaratacaktır.
- Prosedürün kapsamı, programın yürütülmesinin sonudur. Ondan sonra mevcut olmayacak. SetXXX yöntemlerini kullanarak Employee_Details tablosunda güncellenecek değerleri ayarlayın.
- CallableStatement nesnesini kullanarak executeUpdate yöntemini çağırın. Bu yöntem Empoyee_Details masalındaki değerleri güncelleyecektir.
- Verilerin doğru bir şekilde güncellenip güncellenmediğini Employee_details tablosunu kontrol edin.
Hatırlanacak noktalar:
- Toplu işlem, performansı artırır ve veri tutarlılığını korur.
- Bir işlemde birkaç SQL ifadesinin yürütülmesi Toplu işleme olarak bilinir.
- Depolanan Prosedür, iş mantığını gerçekleştirmek için kullanılan SQL ifadeleri bloğudur.
- IN anahtar sözcüğünü kullanarak girdi parametresini prosedüre ve çıkış parametresi için OUT anahtar sözcüğüne geçirebiliriz.
- DB sunucusunda ve geçici olarak Java kodunu kullanarak da bir prosedür oluşturabiliriz.
Sıkça Sorulan Sorular
S # 1) JDBC'de toplu işlem gerçekleştirmek için hangi arayüz kullanılmalıdır?
Cevap: Java paketi, toplu işlem yapma yöntemlerini sağlayan Statement ve PreparedStatement arayüzlerine sahiptir.
S # 2) JDBC'de toplu güncellemeler nasıl çalışır?
Cevap: JDBC toplu güncellemesi, güncellemeleri tek tek göndermek yerine, gruplanan ve Veritabanına tek seferde gönderilen bir dizi güncellemedir. Böylelikle Veritabanındaki ağ trafiğini azaltır.
S # 3) Toplu işleme performansı nasıl artırır?
Cevap: Toplu işlem, verileri tek tek göndermek yerine bir seferde Veritabanına gönderir (yalnızca 1 gidiş dönüş) ve Veritabanı bazı ifadeleri paralel olarak yürütebilir. Bunun gibi uygulamanın performansını arttırmakta ve zamandan tasarruf sağlamaktadır.
S # 4) JDBC'de saklı yordamlarda kabul edilen parametreler nelerdir?
Cevap: Üç tür parametre vardır: IN, OUT ve INOUT parametreleri. IN parametresi giriş değerini almak içindir. OUT parametresi, çıkış değerini almak içindir. INOUT parametresi hem giriş hem de çıkış için kullanılır.
S # 5) JDBC'de bir saklı yordamı yürütmek için kullanılabilen yöntemler nelerdir?
Cevap: CallableStatement Arayüzünü kullanarak prosedürü çağırabiliriz. CallableStatement arabirimi, saklı yordamları yürütmek için üç yöntem sağlar.
Üç yöntem şunlardır:
- executeUpdate (): Prosedür herhangi bir dönüş değeri döndürmezse bu yöntemi kullanın.
- Sorguyu çalıştır(): Prosedür yalnızca bir sonuç kümesi döndürüyorsa bu yöntemi kullanın.
- execute (): Prosedür çok sayıda sonuç kümesi veya bilinmeyen sayıda sonuç kümesi döndürüyorsa bu yöntemi kullanın.
Sonuç
Bu öğreticide toplu işlemeyi ve depolanan prosedürleri ele aldık. Modern dünyada, yüksek performans, veri tutarlılığı ve yeniden kullanılabilirlik, tüm popüler uygulamalar için moda sözcüklerdir. Hem toplu işlem hem de depolanan prosedürler, bu özelliklerin uygulanmasında çok önemli bir rol oynar. Bunları bilmek her yazılım mühendisi için kaçınılmazdır.
Önerilen Kaynaklar
- Java JDBC Eğitimi: JDBC Nedir (Java Veritabanı Bağlantısı)
- Programlama Örneği ile Java JDBC Bağlantısı Eğitimi
- Örneklerle Java JDBC İşlem Yönetimi
- JDBC ResultSet: Verileri Almak İçin Java ResultSet Nasıl Kullanılır
- JDBC Özel Durum İşleme - SQL İstisnalarını İşleme
- JDBC DriverManager, JDBC PreparedStatement And Statement
- Yeni Başlayanlar İçin JAVA Eğitimi: 100+ Uygulamalı Java Video Eğitimi