Pemrosesan Batch di JDBC

Java Top

Saya baru saja mengumumkan kursus Learn Spring baru , yang berfokus pada dasar-dasar Spring 5 dan Spring Boot 2:

>> LIHAT KURSUSnya

1. Perkenalan

Java Database Connectivity (JDBC) adalah Java API yang digunakan untuk berinteraksi dengan database. Pemrosesan batch mengelompokkan beberapa kueri ke dalam satu unit dan meneruskannya dalam satu perjalanan jaringan ke database.

Di artikel ini, kita akan menemukan bagaimana JDBC dapat digunakan untuk pemrosesan batch kueri SQL.

Untuk lebih lanjut tentang JDBC, Anda dapat melihat artikel pengantar kami di sini.

2. Mengapa Batch Processing?

Kinerja dan konsistensi data adalah motif utama untuk melakukan pemrosesan batch.

2.1. Peningkatan Performa

Beberapa kasus penggunaan memerlukan sejumlah besar data untuk dimasukkan ke dalam tabel database. Saat menggunakan JDBC, salah satu cara untuk mencapai ini tanpa pemrosesan batch, adalah dengan menjalankan beberapa kueri secara berurutan.

Mari kita lihat contoh kueri berurutan yang dikirim ke database:

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

Panggilan berurutan ini akan meningkatkan jumlah perjalanan jaringan ke database yang mengakibatkan performa yang buruk.

Dengan menggunakan pemrosesan batch, kueri ini dapat dikirim ke database dalam satu panggilan, sehingga meningkatkan kinerja.

2.2. Konsistensi Data

Dalam keadaan tertentu, data perlu didorong ke beberapa tabel. Ini mengarah ke transaksi yang saling terkait di mana urutan kueri yang didorong menjadi penting.

Setiap kesalahan yang terjadi selama eksekusi akan mengakibatkan rollback data yang didorong oleh kueri sebelumnya jika ada.

Mari kita lihat contoh menambahkan data ke beberapa tabel:

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

Masalah tipikal dalam pendekatan di atas muncul ketika pernyataan pertama berhasil dan pernyataan kedua gagal. Dalam situasi ini, tidak ada rollback data yang dimasukkan oleh pernyataan pertama, menyebabkan ketidakkonsistenan data.

Kami dapat mencapai konsistensi data dengan menjangkau transaksi di beberapa penyisipan / pembaruan dan kemudian melakukan transaksi di akhir atau melakukan rollback jika ada pengecualian, tetapi dalam kasus ini, kami masih memukul database berulang kali untuk setiap pernyataan.

3. Bagaimana Melakukan Pengolahan Batch

JDBC menyediakan dua kelas, Statement dan PreparedStatement untuk mengeksekusi query pada database. Kedua kelas memiliki implementasi sendiri dari metode addBatch () dan executeBatch () yang menyediakan fungsionalitas pemrosesan batch kepada kita.

3.1. Pemrosesan Batch Menggunakan Pernyataan

Dengan JDBC, cara termudah untuk mengeksekusi kueri pada database adalah melalui objek Pernyataan .

Pertama, menggunakan addBatch () kita bisa menambahkan semua query SQL ke batch dan kemudian menjalankan query SQL tersebut menggunakan executeBatch () .

Jenis kembalian dari executeBatch () adalah larik int yang menunjukkan berapa banyak record yang terpengaruh oleh eksekusi setiap pernyataan SQL.

Mari kita lihat contoh membuat dan menjalankan batch menggunakan Pernyataan:

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(); 

Pada contoh di atas, kami mencoba memasukkan record ke dalam tabel EMPLOYEE dan EMP_ADDRESS menggunakan Statement . Kita dapat melihat bagaimana query SQL ditambahkan dalam batch untuk dieksekusi.

3.2. Pemrosesan Batch Menggunakan PreparedStatement

PreparedStatement adalah kelas lain yang digunakan untuk menjalankan kueri SQL . Ini memungkinkan penggunaan kembali pernyataan SQL dan mengharuskan kita untuk mengatur parameter baru untuk setiap pembaruan / penyisipan.

Mari kita lihat contoh menggunakan PreparedStatement. Pertama, kami menyiapkan pernyataan menggunakan kueri SQL yang dikodekan sebagai String:

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

Selanjutnya, kami mengulang melalui array nilai String dan menambahkan kueri yang baru dikonfigurasi ke batch.

Setelah loop selesai, kami menjalankan batch:

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(); 

Dalam contoh yang ditunjukkan di atas, kami memasukkan record ke dalam tabel EMPLOYEE menggunakan PreparedStatement. Kita dapat melihat bagaimana nilai yang akan disisipkan diatur dalam query dan kemudian ditambahkan ke batch untuk dieksekusi.

4. Kesimpulan

Dalam artikel ini, kami melihat bagaimana pemrosesan batch kueri SQL penting saat berinteraksi dengan database menggunakan JDBC.

Seperti biasa, kode yang terkait dengan artikel ini dapat ditemukan di Github.

Jawa bawah

Saya baru saja mengumumkan kursus Learn Spring baru , yang berfokus pada dasar-dasar Spring 5 dan Spring Boot 2:

>> LIHAT KURSUSnya