Pada kondisi tertentu sebuah aplikasi diinginkan untuk memiliki kemampuan menyimpan sekaligus beberapa data dalam sekali klik. Kondisi seperti ini contohnya adalah proses pengimportan data pada berkas spreadsheet atau csv ke dalam relational database. Setidaknya ada 2 pendekatan untuk melakukannya, pertama dengan melakukan multiple insert dan yang kedua dengan menggunakan batch insert. Pada tulisan ini akan kita bahas keduanya tentunya dalam implementasi pada bahasa Java.
Cara 1 : Multiple Insert
Cara ini bekerja dengan mengeksekusi method executeUpdate() milik preparedStatement secara berulang-ulang sesuai dengan jumlah baris data yang akan disimpan. Jika terdapat dua ratus ribu baris data maka akan terjadi dua ratus ribu pengeksekusian query insert.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
package com.agungsetiawan.jdbcbatchinsert; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.Date; public class App{ public static void main( String[] args ) throws SQLException{ Connection connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/1crud", "root", ""); PreparedStatement preparedStatement=connection.prepareStatement("INSERT into siswa(nama,jenis_kelamin,alamat,tanggal_lahir) values(?,?,?,?)"); long startTime = System.currentTimeMillis(); for(int i=1;i<=200000;i++){ preparedStatement.setString(1, "Nama "+i); preparedStatement.setString(2, "Jenis Kelamin "+i); preparedStatement.setString(3, "Alamat "+i); preparedStatement.setDate(4, new java.sql.Date(new Date().getTime())); preparedStatement.executeUpdate(); } preparedStatement.close(); connection.close(); long endTime = System.currentTimeMillis(); long elapsedTime = (endTime - startTime)/1000; System.out.println("Total time required to execute 200000 SQL INSERT queries using PreparedStatement without JDBC batch is :" + elapsedTime); } } |
Hasil pada konsol adalah
Total time required to execute 200000 SQL INSERT queries using PreparedStatement without JDBC batch is :30
Artinya butuh waktu 30 detik untuk memasukkan dua ratus ribu data ke dalam basisdata.
Cara 2 : Batch Insert
Cara berikutnya adalah menggunakan batch insert dimana sejumlah baris data yang akan dimasukkan ke basisdata terlebih dahulu dikumpulkan dalam sebuah batch untuk kemudian baru dieksekusi.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
package com.agungsetiawan.jdbcbatchinsert; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.Date; public class App{ public static void main( String[] args ) throws SQLException{ Connection connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/1crud", "root", ""); PreparedStatement preparedStatement=connection.prepareStatement("INSERT into siswa(nama,jenis_kelamin,alamat,tanggal_lahir) values(?,?,?,?)"); long startTime = System.currentTimeMillis(); for(int i=1;i<=200000;i++){ preparedStatement.setString(1, "Nama "+i); preparedStatement.setString(2, "Jenis Kelamin "+i); preparedStatement.setString(3, "Alamat "+i); preparedStatement.setDate(4, new java.sql.Date(new Date().getTime())); preparedStatement.addBatch(); } preparedStatement.executeBatch(); preparedStatement.close(); connection.close(); long endTime = System.currentTimeMillis(); long elapsedTime = (endTime - startTime)/1000; System.out.println("Total time required to execute 200000 SQL INSERT queries using PreparedStatement with JDBC batch is :" + elapsedTime); } } |
Hasil pada konsol adalah
Total time required to execute 200000 SQL INSERT queries using PreparedStatement with JDBC batch is :28
Artinya butuh waktu 28 detik untuk memasukkan dua ratus ribu baris data ke dalam basisdata. Hal ini juga berarti bahwa penggunaan batch insert relatif lebih cepat daripada menggunakan multiple insert. Tentunya memang harus demikian karena jika tidak buat apa tim pengembang Java khususnya JDBC membuat batch insert kalau ternyata performanya tidak lebih baik daripada multiple insert.