Ho seguito tutte le risposte a questa domanda per cambiare un codice legacy funzionante usando - Statement(ma avendo iniezioni SQL) in una soluzione usando PreparedStatementun codice molto più lento a causa della scarsa comprensione della semantica attorno a Statement.addBatch(String sql)& PreparedStatement.addBatch().
Quindi sto elencando il mio scenario qui in modo che gli altri non commettano lo stesso errore.
Il mio scenario era
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();
Quindi nel codice sopra ho avuto migliaia di query diverse, tutte aggiunte alla stessa istruzione e questo codice ha funzionato più velocemente perché le istruzioni che non venivano memorizzate nella cache erano buone e questo codice veniva eseguito raramente nell'app.
Ora per correggere le iniezioni SQL, ho cambiato questo codice in,
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();
}
Quindi, vedete, ho iniziato a creare migliaia di PreparedStatementoggetti e alla fine non sono stato in grado di utilizzare il batch perché il mio scenario lo richiedeva: ci sono migliaia di query UPDATE o INSERT e tutte queste query sono diverse.
La correzione dell'iniezione SQL era obbligatoria senza alcun costo per il degrado delle prestazioni e non credo che sia possibile PreparedStatementin questo scenario.
Inoltre, quando si utilizza la funzione di batch integrata, è necessario preoccuparsi di chiudere una sola istruzione ma con questo approccio Elenco, è necessario chiudere la dichiarazione prima di riutilizzarla, Riutilizzo di una dichiarazione preparata