Postępowałem zgodnie ze wszystkimi odpowiedziami na to pytanie, aby zmienić działający stary kod, używając - Statement
(ale mając SQL Injections) na rozwiązanie korzystające PreparedStatement
ze znacznie wolniejszego kodu z powodu słabego zrozumienia semantyki wokół Statement.addBatch(String sql)
& PreparedStatement.addBatch()
.
Podaję więc tutaj mój scenariusz, aby inni nie popełnili tego samego błędu.
Mój scenariusz był
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();
Tak więc w powyższym kodzie miałem tysiące różnych zapytań, wszystkie dodane do tej samej instrukcji, a ten kod działał szybciej, ponieważ instrukcje, które nie były buforowane, były dobre i ten kod był wykonywany rzadko w aplikacji.
Teraz, aby naprawić Zastrzyki SQL, zmieniłem ten kod na,
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();
}
Widzicie, zacząłem tworzyć tysiące PreparedStatement
obiektów, a potem ostatecznie nie byłem w stanie korzystać z grupowania, ponieważ mój scenariusz tego wymagał - istnieją tysiące zapytań UPDATE lub INSERT, a wszystkie te zapytania są różne.
Naprawianie wstrzykiwania SQL było obowiązkowe bez kosztów obniżenia wydajności i nie sądzę, aby było możliwe PreparedStatement
w tym scenariuszu.
Ponadto, gdy korzystasz z wbudowanej funkcji grupowania, musisz martwić się o zamknięcie tylko jednej instrukcji, ale w przypadku tej metody Listy musisz zamknąć instrukcję przed ponownym użyciem, Ponowne użycie PreparedStatement