ผมทำตามทุกคำตอบของคำถามนี้เพื่อเปลี่ยนรหัสเดิมการทำงานโดยใช้ - Statement
( แต่มี SQL ฉีด) เพื่อแก้ปัญหาโดยใช้PreparedStatement
ด้วยรหัสช้ากว่ามากเพราะมีความเข้าใจที่ดีของความหมายรอบและStatement.addBatch(String sql)
PreparedStatement.addBatch()
ดังนั้นฉันกำลังแสดงรายการสถานการณ์ของฉันที่นี่เพื่อให้ผู้อื่นไม่ทำผิดพลาดเหมือนกัน
สถานการณ์ของฉันคือ
Statement statement = connection.createStatement();
for (Object object : objectList) {
//Create a query which would be different for each object
// Add this query to statement for batch using - statement.addBatch(query);
}
statement.executeBatch();
ดังนั้นในโค้ดด้านบนฉันมีข้อความค้นหาหลายพันข้อความทั้งหมดเพิ่มลงในคำสั่งเดียวกันและรหัสนี้ทำงานได้เร็วขึ้นเนื่องจากข้อความที่ไม่ได้ถูกแคชก็ดีและโค้ดนี้ทำงานไม่ค่อยในแอป
ตอนนี้เพื่อแก้ไข SQL Injections ฉันเปลี่ยนรหัสนี้เป็น
List<PreparedStatement> pStatements = new ArrayList<>();
for (Object object : objectList) {
//Create a query which would be different for each object
PreparedStatement pStatement =connection.prepareStatement(query);
// This query can't be added to batch because its a different query so I used list.
//Set parameter to pStatement using object
pStatements.add(pStatement);
}// Object loop
// In place of statement.executeBatch(); , I had to loop around the list & execute each update separately
for (PreparedStatement ps : pStatements) {
ps.executeUpdate();
}
คุณเห็นแล้วว่าฉันเริ่มสร้างPreparedStatement
วัตถุหลายพันชิ้นแล้วในที่สุดก็ไม่สามารถใช้การแบทช์เพราะสถานการณ์ของฉันเรียกร้องว่า - มีแบบสอบถาม UPDATE หรือ INSERT หลายพันรายการและแบบสอบถามเหล่านี้ทั้งหมดแตกต่างกัน
การแก้ไขการฉีด SQL จำเป็นต้องมีโดยไม่มีค่าใช้จ่ายในการลดประสิทธิภาพและฉันไม่คิดว่าจะเป็นไปได้PreparedStatement
ในสถานการณ์นี้
นอกจากนี้เมื่อคุณใช้ระบบอำนวยความสะดวกการแบตช์ inbuilt คุณต้องกังวลเกี่ยวกับการปิดงบเพียงครั้งเดียว แต่ด้วยวิธีการแบบรายการนี้คุณจะต้องปิดคำสั่งก่อนที่จะนำมาใช้ซ้ำการใช้PreparedStatementซ้ำ