Я дотримувався всіх відповідей на це питання, щоб змінити діючий застарілий код, використовуючи - Statement
(але маючи SQL Injections) на рішення, що використовує PreparedStatement
набагато повільніший код через погане розуміння семантики навколо Statement.addBatch(String sql)
& PreparedStatement.addBatch()
.
Тому я перелічу тут свій сценарій, щоб інші не помилялися.
Мій сценарій був
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();
Отже, у наведеному вище коді у мене були тисячі різних запитів, усі додавались до одного оператора, і цей код працював швидше, тому що заяви, які не кешуються, були хорошими, і цей код виконується рідко в додатку.
Тепер, щоб виправити ін'єкції SQL, я змінив цей код на
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();
}
Отже, я бачу, я почав створювати тисячі PreparedStatement
об'єктів, а потім врешті-решт не міг використовувати пакетну групу, оскільки мій сценарій вимагав цього - є тисячі запитів UPDATE або INSERT, і всі ці запити бувають різними.
Виправлення ін'єкцій SQL було обов'язковим без погіршення продуктивності, і я не думаю, що це можливо PreparedStatement
в цьому сценарії.
Крім того, коли ви використовуєте вбудований пакетний засіб, вам потрібно потурбуватися про закриття лише однієї заяви, але при такому підході до списку вам потрібно закрити заяву перед повторним використанням, повторно використовуючи підготовлений стан