Я следовал всем ответам на этот вопрос, чтобы изменить работающий унаследованный код, используя - Statement
(но с SQL-инъекциями) решение, использующее 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
в этом сценарии.
Кроме того, когда вы используете встроенную функцию пакетирования, вам нужно беспокоиться о закрытии только одного оператора, но при этом подходе List необходимо закрыть оператор перед повторным использованием, повторное использование PreparedStatement