การใช้ 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
No comments yet.