Ich habe alle Antworten auf diese Frage befolgt, um einen funktionierenden Legacy-Code mit - Statement
(aber mit SQL Injections) in eine Lösung PreparedStatement
mit einem viel langsameren Code zu ändern, da die Semantik um Statement.addBatch(String sql)
& schlecht verstanden wurdePreparedStatement.addBatch()
.
Deshalb liste ich hier mein Szenario auf, damit andere nicht den gleichen Fehler machen.
Mein Szenario war
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();
Im obigen Code hatte ich Tausende verschiedener Abfragen, die alle zur selben Anweisung hinzugefügt wurden, und dieser Code funktionierte schneller, da nicht zwischengespeicherte Anweisungen gut waren und dieser Code in der App selten ausgeführt wurde.
Um SQL Injections zu reparieren, habe ich diesen Code geändert 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();
}
Sie sehen, ich habe angefangen, Tausende von PreparedStatement
Objekten zu erstellen und konnte dann möglicherweise keine Stapelverarbeitung verwenden, weil mein Szenario dies erforderte - es gibt Tausende von UPDATE- oder INSERT-Abfragen und all diese Abfragen sind zufällig unterschiedlich.
Das Reparieren der SQL-Injection war ohne Kosten für Leistungseinbußen obligatorisch, und ich glaube nicht, dass dies PreparedStatement
in diesem Szenario möglich ist.
Wenn Sie die integrierte Stapelverarbeitungsfunktion verwenden, müssen Sie sich nur darum kümmern, nur eine Anweisung zu schließen. Bei diesem List-Ansatz müssen Sie die Anweisung jedoch vor der Wiederverwendung schließen und eine vorbereitete Anweisung wiederverwenden