Apa itu Batch Update

Posted: June 15, 2013 in JDBC
Tags: , , , ,

Apa itu batch update ? Batch update adalah suatu proses yang dapat menjalakan lebih dari satu statement SQL dalam satu kali akses server database. Statement SQL yang dapat dijalankan adalah insert, update, delete dan create. Batch Update tidak dapat menjalakan statement select.

Bingung baca teori ? Ok langsung saja saya berikan contohnya agar lebih jelas apa itu batch update dan apa keuntungannya. Langsung saja buat sebuah class ConnectionUtil seperti yang ada di tulisan-tulisan saya yang sebelumnya.

package com.maniakjava.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
 
public class ConnectionUtil {
 
    public static Connection getConnection() {
        Connection conn = null;
        try {
            Class.forName("org.postgresql.Driver");
            String url = "jdbc:postgresql://localhost:5432/maniakjava";
            String user = "postgres";
            String pass = "xxx";
            conn = DriverManager.getConnection(url, user, pass);
        } catch (ClassNotFoundException cnfe) {
            System.err.println("Class error :  " + cnfe.getMessage());
        } catch (SQLException se) {
            System.err.println("SQL error : " + se.getMessage());
        } catch (Exception e) {
            System.err.println("Error : " + e.getMessage());
        }
        return conn;
    }
}


Lalu buat sebuah class CaraBiasa berikut ini. Class CaraBiasa akan berfungsi untuk melakukan insert dan update beberapa data sekaligus.

package com.maniakjava.main;

import com.maniakjava.util.ConnectionUtil;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;

public class CaraBiasa {

    public static void main(String[] args) {
       String[] allQuery = {"insert into person(no,name) values(1,'aaa')",
            "insert into person(no,name) values(2,'bbb')",
            "insert into person(no,name) values(3,'ccc')",
            "insert into person(no,name) values(4,'ddd')",
            "insert into person(no,name) values(5,'eee')",
            "update person set name='xxx' where no=1"
        };
        Connection conn = null;
        Statement stmt = null;
        try {
            conn = ConnectionUtil.getConnection();
            stmt = conn.createStatement();
            for (String query : allQuery) {
                stmt.execute(query);
            }
            
        } catch (Exception e) {
        } finally {
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException ex) {
                    Logger.getLogger(CaraBiasa.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            if (stmt != null) {
                try {
                    stmt.close();
                } catch (SQLException ex) {
                    Logger.getLogger(CaraBiasa.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    }
}

Nah dengan menggunakan execute statement biasa seperti di atas, maka setiap kali statement dijalankan akan mengakses ke database.
Bayangkan jika kita akan melakukan insert 1000 data. Tentu akan memboroskan sumber daya jaringan, belum lagi adanya kemungkinan terjadi exception java.lang.OutOfMemoryError: Java heap space karena kehabisan memory.

Maka solusi untuk mengatasi masalah diatas adalah dengan menggunakan batch update. Maka jika ada 1000 statement insert atau update, semuanya akan dijalankan dalam satu kali akses ke database. Berikut ini adalah cara menggunakan batch update.

package com.maniakjava.main;

import com.maniakjava.util.ConnectionUtil;
import java.sql.BatchUpdateException;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;

public class BatchUpdate {

    public static void main(String[] args) {
        String[] allQuery = {"insert into person(no,name) values(1,'aaa')",
            "insert into person(no,name) values(2,'bbb')",
            "insert into person(no,name) values(3,'ccc')",
            "insert into person(no,name) values(4,'ddd')",
            "insert into person(no,name) values(5,'eee')",
            "update person set name='xxx' where no=1"
        };
        Connection conn = null;
        Statement stmt = null;
        try {
            conn = ConnectionUtil.getConnection();
            stmt = conn.createStatement();
            for (String query : allQuery) {
                stmt.addBatch(query);
            }
            
            int[] results = stmt.executeBatch();            
            for (int i = 0; i < results.length; i++) {
                System.out.println("results for statement - " + (i+1) + " : " + results[i]);
            }
        } catch (Exception e) {
        } finally {
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException ex) {
                    Logger.getLogger(BatchUpdate.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            if (stmt != null) {
                try {
                    stmt.close();
                } catch (SQLException ex) {
                    Logger.getLogger(BatchUpdate.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    }
}

Output yang ditampilkan merupakan jumlah baris yang dipengaruhi oleh setiap perintah SQL yang dijalankan.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s