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

ทำไม Prepared Statements ใน JDBC เร็วกว่า Statements? อธิบาย


เมื่อใช้ Statement object รันคำสั่ง INSERT ซ้ำๆ ทุกครั้งจะคอมไพล์และรันคำสั่งทั้งหมดใหม่ แม้โครงสร้างคำสั่งเหมือนกัน แค่ค่าที่เปลี่ยน

Prepared statement เป็น precompiled statement คอมไพล์คำสั่งไว้ในฐานข้อมูล ใช้ placeholder (?) แทนค่า ส่งค่าเข้ามาในภายหลัง

ดังนั้นหลีกเลี่ยงการคอมไพล์และรันคำสั่งซ้ำๆ ได้

ตัวอย่างเปรียบเทียบ

ตาราง Dataset คอลัมน์ mobile_brand, unit_sale

ใช้ Statement (คอมไพล์ซ้ำ 10 ครั้ง):

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)");

ใช้ PreparedStatement (คอมไพล์ครั้งเดียว):

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();

PreparedStatement คอมไพล์คำสั่งครั้งเดียว ส่งค่าเข้ามาเรื่อยๆ ผ่าน setter methods ประหยัดทรัพยากร