Posts Tagged ‘ Batch Insert

[Java] การใช้งาน Batch Updates/Insert

มีงานที่ต้องอ่านข้อมูลขนาดใหญ่จาก text file(ประมาณไฟล์ละ 800M) แล้วทำการบันทึกลงฐานข้อมูล ซึ่งต้องใช้เวลามาก นอกจากวิธีนี้ก็ไม่รู้จะใช้วิธีการแบบไหนในการนำข้อมูลขนาดใหญ่(กลางๆ) แบบนี้ลงไปในฐานข้อมูลได้เพราะข้อมูลที่จัดเก็บนั้นต้องตรวจสอบว่าตรงตามเงื่อนไขหรือไม่ ก่อนทำการบันทึก ทดลองใช้ insert แบบธรรมดาสามัญสุดๆ แล้วก็พบว่าแทบตายครับช้ามาก กว่าจะอ่านเสร็จแต่ละไฟล์ และ บันทึกข้อมูลเสร็จ เลยทดลองมาใช้ Batch Update/Insert แทน ซึ่งเร็วกว่าเดิมมาก แต่มาติดปัญหาตรง
1. เวลาข้อมูลซ้ำกับที่ Insert ไปแล้วก็ไม่ต้องสนใจ ข้ามไปยังรายการถัดไปเลย แต่ Batch Update ทำไมไ่ด้ครับ เช่น เราเคยบันทึกข้อมูล

1001
1002 

ไปแล้ว เมื่อต้องบันทึกข้อมูลดังกล่าวซ้ำไปอีก แต่เป็น

1003 
1001 
1004

รายการ 1003 ลงได้ปกติ 1001 จะเกิด Exception ทำให้รายการ 1004 ไม่ลงไปด้วย ผมก็ลองสรรหาวิธีทำให้ Batch Insert ทำรายการต่อไปถึงแม้จะเกิด Exception ลองอ่านเอกสารของ executeBatch() ได้ใจความว่า

If one of the commands in a batch update fails to execute properly, this method throws a BatchUpdateException, and a JDBC driver may or may not continue to process the remaining commands in the batch. However, the driver’s behavior must be consistent with a particular DBMS, either always continuing to process commands or never continuing to process commands……

จากนั้นไปทดลองใช้ Class ของ Oracle เองก็ไม่ได้เหมือนกัน หมดหวังกันที่เดียวเลย สุดถ้ายก็กลับไปตายด้วยวิธีเดิม

หมายเหตุ : จากงานนี้ทำให้รู้ว่า เวลาจะประมวลผลอะไรใหญ่ๆ หนักๆ ควรจะรัน Java ใน Server Mode และกำหนดหน่วยความจำเพิ่มขึ้นเช่น

java -server -Xms512m -Xmx1024m com/fun4station/BatchExecute

แหล่งข้อมูล
java – the Java application launcher
Performance Extensions
Java HotSpot VM Options
Batch Updates
Statement