Я просто сравниваю сложную систему и обнаружил, что запросы, проходящие через Spring, очень медленные.Производительность с использованием Spring jdbcTemplate по сравнению с обычным PreparedStatement
Он добавляет ~ 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 не делает?
Просто примечание: в вашем подготовленном сценарии вы не включаете время, необходимое для установления соединения. В зависимости от вашей конфигурации небезопасно предполагать, что эта операция тривиальна или имеет несущественное потребление времени. – pap
pap спасибо за ваш ответ. Тем не менее, получение соединения занимает около 20 мс в моей настройке. И я предполагаю, что jdbcTemplate повторно использует существующие соединения и не использует новые на каждом 'update' – Felix
@Felix, повторное использование соединений не имеет ничего общего с весной, но с вашим пулом соединений, если у вас есть. Поэтому это необходимо учитывать. – tom