เมื่อใช้ JDBC เพื่อเชื่อมต่อกับฐานข้อมูล MySQL สำหรับการแทรกข้อมูลโดยเฉพาะอย่างยิ่งชุดข้อมูลขนาดใหญ่จะถูกแทรกอย่างต่อเนื่อง (100,000) วิธีปรับปรุงประสิทธิภาพ?
มีสองวิธีของคำสั่งในส่วนต่อประสานการเขียนโปรแกรม JDBC ที่มีความสำคัญเป็นพิเศษ:
การประมวลผลแบทช์ของข้อมูลสามารถทำได้โดยใช้ addBatch() และวิธี executeBatch()
อย่างไรก็ตามเป็นที่น่าสังเกตว่าก่อนอื่นคุณต้องตั้งค่าการกระทำด้วยตนเองในลิงค์ฐานข้อมูล, connection.setAutoCommit(false) จากนั้นเรียกใช้ connection.commit() หลังจากดำเนินการคำสั่ง
นำเข้า java.io.bufferedreader; นำเข้า java.io.ioException; นำเข้า java.sql.drivermanager; นำเข้า java.sql.preparedStatement; นำเข้า java.sql.sqlexception; นำเข้า Java.util.date; db_test (param1, param2, param3, param4, param5) ค่า (?,?,?,?,?) "; สตริงส่วนตัว charset = "utf-8"; สตริงส่วนตัว connectstr = "jdbc: mysql: // localhost: 3306/test"; ชื่อผู้ใช้สตริงส่วนตัว = "รูท"; รหัสผ่านสตริงส่วนตัว = "123456"; โมฆะส่วนตัว dostore () พ่น classnotfoundexception, sqlexception, ioexception {class.forname ("com.mysql.jdbc.driver"); ConnectStr += "? useerverprepstmts = false & rewriteBatchedStatements = true"; // นี่คือการทดสอบสำหรับการแทรกชุดที่มีประสิทธิภาพและการแทรกชุดปกติจะถูกลบออกหลังจากการเชื่อมต่อการดำเนินการ conn = (เชื่อมต่อ) driverManager.getConnection conn.setautocommit (เท็จ); // ตั้งค่าการส่งคู่มือ int count = 0; PreparedStatement PSTS = Conn.PrepareStatement (SQL); สตริงบรรทัด = null; วันที่เริ่มต้น = วันที่ใหม่ (); สำหรับ (int i = 0; i <= 100000; i ++) {psts.setstring (1, i+"param1"); psts.setstring (2, i+"param2"); psts.setstring (3, i+"param3"); psts.setstring (4, i+"param4"); psts.setstring (5, i+"param5"); psts.addbatch (); // เพิ่มจำนวนการประมวลผลแบทช์ ++; } psts.executeBatch (); // ดำเนินการประมวลผลแบทช์ conn.commit (); // ส่งวันที่สิ้นสุด = วันที่ใหม่ (); System.out.println ("ปริมาณ ="+นับ); System.out.println ("runtime ="+(end.getTime ()-เริ่มต้น. getTime ())); conn.close (); } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {ลอง {ใหม่ mysqlbatchutil (). dostore (); } catch (classnotFoundException e) {e.printStackTrace (); } catch (sqlexception e) {e.printstacktrace (); } catch (ioexception e) {e.printstacktrace (); -ผลการทดสอบ:
ปริมาณ = 10,0001
เวลาทำงาน = 4725
ทั้งหมด 10W และเวลาดำเนินการใช้เวลา 47 วินาที
ประสิทธิภาพนี้ยังไม่สูงและดูเหมือนจะไม่บรรลุผลที่ต้องการและต้องการการปรับปรุงเพิ่มเติม
พารามิเตอร์สามารถเพิ่มลงในสตริงการเชื่อมต่อ MySQL JDBC
rewriteBatchedStatements = true
MySQL ได้ปิดการประมวลผลแบบแบตช์โดยค่าเริ่มต้นและจะเปิดผ่านพารามิเตอร์นี้ พารามิเตอร์นี้สามารถเขียนคำสั่ง SQL ที่ส่งไปยังฐานข้อมูลใหม่
useRverPrepstMts = false
หากไม่ได้เปิดใช้งาน (useerverprepstmts = false) ให้ใช้ com.mysql.jdbc.preparedStatement สำหรับแอสเซมบลี SQL ท้องถิ่นและในที่สุดก็ส่งไปยัง DB มันเป็น SQL สุดท้ายที่ถูกแทนที่
นี่คือการปรับปรุงเล็กน้อยเพิ่มคำสั่งต่อไปนี้ลงในสตริงการเชื่อมต่อ (ลบความคิดเห็นในตัวสร้างรหัส):
ConnectStr += "? useerverprepstmts = false & rewriteBatchedStatements = true";
ผลการทดสอบมีดังนี้:
ปริมาณ = 10,0001
เวลาทำงาน = 1213
ด้วยข้อมูลจำนวนเท่ากันคราวนี้ใช้เวลาเพียง 12 วินาทีในการดำเนินการซึ่งแสดงให้เห็นว่าประสิทธิภาพการประมวลผลได้รับการปรับปรุงอย่างมาก ฮ่าฮ่า
ข้างต้นคือประสิทธิภาพการทดสอบของการใช้ JDBC เพื่อแทรกข้อมูล 10W ลงในชุดฐานข้อมูล MySQL ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับทุกคนในเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!