Saya mengikuti semua jawaban dari pertanyaan ini untuk mengubah kode lama bekerja menggunakan - Statement
(tetapi memiliki SQL Suntikan) untuk solusi menggunakan PreparedStatement
dengan kode yang jauh lebih lambat karena pemahaman semantik sekitar Statement.addBatch(String sql)
& kurang PreparedStatement.addBatch()
.
Jadi saya daftar skenario saya di sini sehingga orang lain tidak membuat kesalahan yang sama.
Skenario saya adalah
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();
Jadi dalam kode di atas, saya memiliki ribuan pertanyaan yang berbeda, semua ditambahkan ke pernyataan yang sama dan kode ini bekerja lebih cepat karena pernyataan yang tidak di-cache bagus & kode ini jarang dieksekusi di app.
Sekarang untuk memperbaiki Suntikan SQL, saya mengubah kode ini menjadi,
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();
}
Jadi Anda lihat, saya mulai membuat ribuan PreparedStatement
objek & akhirnya tidak dapat memanfaatkan batching karena skenario saya menuntut - ada ribuan permintaan UPDATE atau INSERT & semua pertanyaan ini kebetulan berbeda.
Memperbaiki injeksi SQL adalah wajib tanpa biaya penurunan kinerja dan saya tidak berpikir itu mungkin terjadi PreparedStatement
dalam skenario ini.
Juga, ketika Anda menggunakan fasilitas batching inbuilt, Anda harus khawatir tentang hanya menutup satu Pernyataan tetapi dengan pendekatan Daftar ini, Anda perlu menutup pernyataan sebelum digunakan kembali, Menggunakan Kembali PreparedStatement