การใช้ Batch Update กับ Prepared Statement

วิธีการบันทึกข้อมูลขนาดมากลงฐานข้อมูลโดยผ่าน Prepared Statement นั้นช่วยให้สามารถบันทึกข้อมูลได้เร็วกว่าการ Insert แบบธรรมดา สำหรับตัวอย่าง code เป็นดังนี้
1. สร้าง Class JavaBatch ดังนี้

/**
 * File Name : JavaBatch.java
 * Created Date : Nov 5, 2009 : 11:38:12 AM
 * http://www.secondknow.com
 */
package com.secondknow.test;

/**
 * @Author Supot Saelao 
 * @Version 1.0
 */
public class JavaBatch {
	private Connection conn = null;	
	public static void main(String[] args){
              //Implement code here
	}
}

2. สร้าง Method สำหรับ Connect Database

public void openConnection() {		
	try {
		Class.forName("com.mysql.jdbc.Driver");
		conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/bach","root","java");
	} catch (ClassNotFoundException e) {
		e.printStackTrace();
	} catch (SQLException e) {
		e.printStackTrace();
	}		
}


3. สร้าง Method สำหรับ ตรวจสอบสถานะของ batch

public void checkUpdateBatch(int[] records) {
	for(int i : records){
        if (records[i] >= 0) {
          	System.out.println("Successfully number of row available");
        } else if (records[i] == Statement.SUCCESS_NO_INFO) {
           	System.out.println("Successfully number of row not available");
        } else if (records[i] == Statement.EXECUTE_FAILED) {
           	System.out.println("Failed to execute");
        }
	}
}

4. สร้าง Method ในการ Execute batch

public void batchInsert() throws SQLException{							
	PreparedStatement pstm = null;
	try{
		//Open connection
		openConnection();
		//Disable auto-commit
		conn.setAutoCommit(false);
		
		String sql = "INSERT INTO BATCH(ID,FIRST_NAME,LAST_NAME) VALUES(?,?,?)";
		pstm = conn.prepareStatement(sql);	
						
		for(int i = 0; i < 10000; i++){
			pstm.setInt(1,i);
			pstm.setString(2, "first name"+i);
			pstm.setString(3, "Last name"+i);

			pstm.addBatch();
		}
			
	       //Excute batch insert
               int [] records = pstm.executeBatch();
              //Check update batch status
              this.checkUpdateBatch(records);
        
              conn.commit();
	}catch (BatchUpdateException e){
		//Get batch record execute
		int[] records = e.getUpdateCounts();
                //Check update batch status
                this.checkUpdateBatch(records);
                conn.rollback();
	}catch (SQLException e){
		conn.rollback();
	}finally{
		pstm.close();
		conn.close();
	}
}

ซึ่งจากการทดลองใช้งาน สามารถทำงานได้เร็วกว่าการ Insert แบบอื่นเหมาะสำหรับการบันทึกข้อมูลขนาดมาก แต่ก็มีปัญหา เช่นกรณีที่เกิด Exception ขึ้นกับรายการใด รายการหนึ่งที่อยู่ใน batch ก็ไม่สามารถควบคุมได้ (เช่นให้รายการที่เสร็จแล้ว commit รายการที่เกิดปัญหา rollback หรือผมใช้ไม่เป็นเองก็ไม่รู้) Downlaod ตัวอย่าง Code
อ้างอิง
Batch Updates
Executing a Batch of SQL Statements in a Database

  1. No comments yet.

  1. No trackbacks yet.