2012-03-08 3 views
2

Я просто сравниваю сложную систему и обнаружил, что запросы, проходящие через 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 не делает?

+3

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

+0

pap спасибо за ваш ответ. Тем не менее, получение соединения занимает около 20 мс в моей настройке. И я предполагаю, что jdbcTemplate повторно использует существующие соединения и не использует новые на каждом 'update' – Felix

+1

@Felix, повторное использование соединений не имеет ничего общего с весной, но с вашим пулом соединений, если у вас есть. Поэтому это необходимо учитывать. – tom

ответ

2

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

@Felix, повторное использование соединений не имеет ничего общего с весной, но с вашим пулом соединений, если у вас есть. Поэтому это необходимо учитывать.

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

0

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

Смежные вопросы