Сейчас я попробовал оператор select с PreparedStatement
, но оказалось, что он не быстрее шаблона Jdbc. Возможно, как предположил mezmo, он автоматически создает подготовленные утверждения.
В любом случае, причина того, что мои sql SELECT
ы были такими медленными, заключалась в другом. В пункте WHERE
я всегда использовал оператор LIKE
, когда все, что я хотел сделать, это найти точное совпадение. Как я выяснил, LIKE
ищет по шаблону и поэтому работает довольно медленно.
Сейчас я использую оператор =
, и это намного быстрее.
По умолчанию JDBCTemplate
выполняет свой собственный PreparedStatement
внутри, если вы просто используете форму .update (String sql, Object ... args)
. Spring и ваша база данных будут управлять скомпилированным запросом за вас, поэтому вам не нужно беспокоиться об открытии, закрытии, защите ресурсов и т. Д. Одно из спасительных достоинств Spring. Ссылка на документацию Spring 2.5 по этому поводу. Надеюсь, это проясняет ситуацию. Кроме того, кэширование операторов может выполняться на уровне JDBC, как в случае , по крайней мере, некоторых драйверов JDBC Oracle.
Здесь будет гораздо больше деталей, чем я могу компетентно.
Попробуйте следующее:
PreparedStatementCreator creator = new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
PreparedStatement updateSales = con.prepareStatement(
"UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ? ");
updateSales.setInt(1, 75);
updateSales.setString(2, "Colombian");
return updateSales;
}
};
Я бы разложил обработку подготовленного оператора по крайней мере на методы. В данном случае, поскольку результатов нет, это довольно просто (и если предположить, что соединение является переменной экземпляра, которая не изменяется):
private PreparedStatement updateSales;
public void updateSales(int sales, String cof_name) throws SQLException {
if (updateSales == null) {
updateSales = con.prepareStatement(
"UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ?");
}
updateSales.setInt(1, sales);
updateSales.setString(2, cof_name);
updateSales.executeUpdate();
}
В этом случае, это просто вопрос вызова:
updateSales(75, "Colombian");
Что довольно просто интегрировать с другими вещами, да? И если вы вызываете метод много раз, обновление будет создано только один раз, что значительно ускорит работу. Ну, при условии, что вы не будете делать таких безумных вещей, как выполнение каждого обновления в отдельной транзакции...
Обратите внимание, что типы фиксированы. Это потому, что для любого конкретного запроса/обновления они должны быть фиксированными, чтобы база данных могла эффективно выполнять свою работу. Если вы просто извлекаете произвольные строки из CSV-файла, передавайте их как строки. Также отсутствует блокировка; гораздо лучше, если отдельные соединения будут использоваться из одного потока.