- Bir çalışma eski kodu kullanarak değiştirmek için bu sorunun tüm cevapları takip Statement
kullanarak bir çözüme (SQL Enjeksiyonlar ancak sahip) PreparedStatement
çünkü etrafında semantik kötü anlayış çok daha yavaş koduyla Statement.addBatch(String sql)
& PreparedStatement.addBatch()
.
Bu yüzden senaryomu burada listeliyorum, böylece diğerleri aynı hatayı yapmıyor.
Senaryom
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();
Bu yüzden yukarıdaki kodda, hepsi aynı ifadeye eklenen binlerce farklı sorgu vardı ve önbelleğe alınmayan ifadeler iyi olduğundan ve bu kod uygulamada nadiren yürütüldüğünden bu kod daha hızlı çalıştı.
Şimdi SQL Enjeksiyonlarını düzeltmek için bu kodu
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();
}
Gördüğünüz gibi, binlerce PreparedStatement
nesne oluşturmaya başladım ve sonunda senaryoyu kullanamadım çünkü senaryom bunu istedi - binlerce GÜNCELLEME veya INSERT sorgusu var ve bu sorguların hepsi farklı oluyor.
SQL enjeksiyonunu sabitlemek hiçbir performans düşüşü pahasına zorunluydu ve PreparedStatement
bu senaryoda bunun mümkün olduğunu düşünmüyorum .
Ayrıca, dahili toplu iş özelliğini kullandığınızda, yalnızca bir Deyimi kapatma konusunda endişelenmeniz gerekir, ancak bu Liste yaklaşımıyla, yeniden kullanmadan önce ifadeyi kapatmanız gerekir, bir PreparedStatement'ı Yeniden Kullanmanız gerekir