Снижение производительности при использовании Spring jdbcTemplate по сравнению с обычным PreparedStatement - PullRequest
2 голосов
/ 08 марта 2012

Я просто тестирую сложную систему и обнаружил, что запросы, проходящие через Spring, очень медленные.

Это добавляет ~ 600 мс.

Код теста сравнивает следующее:

case TEMPLATE:
{
    t = System.currentTimeMillis();
    jdbcTemplate.update(getUnnamedPreparedStatement(query), new PreparedStatementSetter() {

        @Override
        public void setValues(PreparedStatement ps) throws SQLException {
            int i = 1;
            for (Object o : queryParameters) {
                ps.setObject(i++, o);
            }
        }
    });
    break;
}

case PREPAREDSTATEMENT:
{
    Connection c = dataSource.getConnection();
    t = System.currentTimeMillis();
    PreparedStatement ps = c.prepareStatement(getUnnamedPreparedStatement(query));
    int index = 1;
    for (Object parameter: queryParameters) {
        ps.setObject(index++, parameter);
    }
    ResultSet rs = ps.executeQuery();
    rs.next();
    break;
}

Оба запроса дают одинаковый результат, и порядок не имеет значения.Более того, это не зависит от типа запроса (т. Е. SELECT, UPDATE).

Я выполнил тест десять раз, и результаты стабильны.

Что делает Spring jdbcTemplate,что PreparedStatement не делает?

Ответы [ 2 ]

2 голосов
/ 08 марта 2012

Поскольку мой комментарий выше является правильным ответом, я опубликую его в качестве ответа для будущих консультаций.

@ Феликс, повторное использование соединений не имеет ничего общего с пружиной, но с вашим пулом соединений, если он у вас есть. Так что это следует учитывать.

В общем, я думаю, что пул соединений отсутствовал в весеннем проекте.

0 голосов
/ 08 марта 2012

В первом случае выполняется запрос на обновление, а во втором - запрос на выборку. Второй должен использовать ps.executeUpdate(), чтобы быть похожим на первый.

...