Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

เหตุใดคำสั่งที่เตรียมไว้ใน JDBC จึงเร็วกว่างบ อธิบาย?


ขณะดำเนินการคำสั่งโดยใช้อ็อบเจ็กต์ Statement โดยเฉพาะการแทรกคำสั่ง ทุกครั้งที่มีการเรียกใช้คิวรี่ คำสั่งทั้งหมดจะถูกรวบรวมและดำเนินการซ้ำแล้วซ้ำเล่า โดยที่ความแตกต่างเพียงอย่างเดียวระหว่างคำสั่งเหล่านี้คือค่าของคำสั่ง

ในขณะที่ข้อความสั่งที่เตรียมไว้นั้นเป็นคำสั่งที่คอมไพล์ล่วงหน้า เช่น คิวรีถูกรวบรวมและจัดเก็บไว้ในฐานข้อมูล โดยใช้ตัวยึดตำแหน่ง (?) แทนค่าและค่าของตัวยึดตำแหน่งเหล่านี้จะถูกส่งในภายหลัง

ดังนั้น การหลีกเลี่ยงการคอมไพล์ที่ไม่จำเป็นและการดำเนินการคำสั่งซ้ำแล้วซ้ำเล่า

ตัวอย่าง

สมมติว่าเรามีตารางชื่อ ชุดข้อมูล ในฐานข้อมูลที่มีคอลัมน์ mobile_brand และ ขายต่อหน่วย หากเราต้องการแทรกเรคคอร์ดลงในตารางนี้โดยใช้อ็อบเจกต์คำสั่ง โค้ดจะเป็นดังนี้:

stmt.executeUpdate("insert into Dataset values('Iphone', 3000)");
stmt.executeUpdate("insert into Dataset values('Samsung', 4000)");
stmt.executeUpdate("insert into Dataset values('Nokia', 5000)");
stmt.executeUpdate("insert into Dataset values('Vivo', 1500)");
stmt.executeUpdate("insert into Dataset values('Oppo', 9000)");
stmt.executeUpdate("insert into Dataset values('MI', 6400)");
stmt.executeUpdate("insert into Dataset values('MotoG', 4360)");
stmt.executeUpdate("insert into Dataset values('Lenovo', 4100)");
stmt.executeUpdate("insert into Dataset values('RedMi', 4000)");
stmt.executeUpdate("insert into Dataset values('OnePlus', 6334)");

และสำหรับทุกๆ executeUpdate() วิธีการเรียกคำสั่งทั้งหมดในนั้นจะถูกรวบรวมและดำเนินการ ที่นี่ หากคุณสังเกตเห็นเฉพาะค่าของคำสั่งที่มีการเปลี่ยนแปลง และการค้นหาที่เหลือกำลังถูกรวบรวมโดยไม่จำเป็น

หากคุณเขียนข้อความค้นหาการแทรกโดยใช้คำสั่งที่เตรียมไว้เพื่อแทรกข้อมูลเดียวกันในตารางเดียวกัน โค้ดจะมีลักษณะดังนี้:

PreparedStatement pstmt = con.prepareStatement("insert into Dataset values(?, ?)");

pstmt.setString(1, "Iphone");
pstmt.setInt(2, 3000);
pstmt.executeUpdate();

pstmt.setString(1, "Samsung");
pstmt.setInt(2, 4000);
pstmt.executeUpdate();

pstmt.setString(1, "Nokia");
pstmt.setInt(2, 5000);
pstmt.executeUpdate();

pstmt.setString(1, "Vivo");
pstmt.setInt(2, 1500);
pstmt.executeUpdate();

pstmt.setString(1, "Oppo");
pstmt.setInt(2, 900);
pstmt.executeUpdate();

pstmt.setString(1, "MI");
pstmt.setInt(2, 6400);
pstmt.executeUpdate();

pstmt.setString(1, "MotoG");
pstmt.setInt(2, 4360);
pstmt.executeUpdate();

pstmt.setString(1, "Lenovo");
pstmt.setInt(2, 4100);
pstmt.executeUpdate();

pstmt.setString(1, "RedMi");
pstmt.setInt(2, 4000);
pstmt.executeUpdate();

pstmt.setString(1, "MotoG");
pstmt.setInt(2, 4360);
pstmt.executeUpdate();

pstmt.setString(1, "OnePlus");
pstmt.setInt(2, 6334);
pstmt.executeUpdate();

ที่นี่ หากคุณสังเกตว่าแบบสอบถามแทรกถูกจัดเตรียมด้วยตัวยึดตำแหน่ง (?) และแบบสอบถามนี้รวบรวมและจัดเก็บไว้ในฐานข้อมูล และต่อมา ค่าจะถูกส่งผ่านโดยใช้เมธอด setter ของอินเทอร์เฟซ PreparedStatement เพื่อหลีกเลี่ยงการดำเนินการที่ไม่จำเป็นของคำสั่ง