Использование подготовленных операторов с JDBCTemplate

26
задан engineerC 26 February 2016 в 18:30
поделиться

4 ответа

Сейчас я попробовал оператор select с PreparedStatement, но оказалось, что он не быстрее шаблона Jdbc. Возможно, как предположил mezmo, он автоматически создает подготовленные утверждения.

В любом случае, причина того, что мои sql SELECTы были такими медленными, заключалась в другом. В пункте WHERE я всегда использовал оператор LIKE, когда все, что я хотел сделать, это найти точное совпадение. Как я выяснил, LIKE ищет по шаблону и поэтому работает довольно медленно.

Сейчас я использую оператор =, и это намного быстрее.

2
ответ дан 28 November 2019 в 06:39
поделиться

По умолчанию JDBCTemplate выполняет свой собственный PreparedStatement внутри, если вы просто используете форму .update (String sql, Object ... args) . Spring и ваша база данных будут управлять скомпилированным запросом за вас, поэтому вам не нужно беспокоиться об открытии, закрытии, защите ресурсов и т. Д. Одно из спасительных достоинств Spring. Ссылка на документацию Spring 2.5 по этому поводу. Надеюсь, это проясняет ситуацию. Кроме того, кэширование операторов может выполняться на уровне JDBC, как в случае , по крайней мере, некоторых драйверов JDBC Oracle. Здесь будет гораздо больше деталей, чем я могу компетентно.

28
ответ дан 28 November 2019 в 06:39
поделиться

Попробуйте следующее:

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;
    }
};
10
ответ дан 28 November 2019 в 06:39
поделиться

Я бы разложил обработку подготовленного оператора по крайней мере на методы. В данном случае, поскольку результатов нет, это довольно просто (и если предположить, что соединение является переменной экземпляра, которая не изменяется):

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-файла, передавайте их как строки. Также отсутствует блокировка; гораздо лучше, если отдельные соединения будут использоваться из одного потока.

3
ответ дан 28 November 2019 в 06:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: