Весна JDBC против JDBC

Я пытался использовать Spring 3.0 SimpleJdbcTemplate, и для вставки 1500 записей требуется 5 минут, тогда как мне требуется несколько секунд. для вставки с использованием прямого JDBC. Не уверен, что я делаю неправильно.


person seno    schedule 09.08.2010    source источник
comment
Это не вопрос и не дает нам никакого кода для тщательного изучения. Как вы ожидаете, что мы вам поможем? Пожалуйста, рассмотрите возможность предоставления более подробной информации.   -  person Andrew    schedule 09.08.2010
comment
Не говорю, что вставка должна занимать 5 минут, но будет задержка, когда вы используете любую структуру поверх прямого jdbc. Опубликуйте свои запросы/код, чтобы мы могли видеть, что происходит.   -  person del.ave    schedule 09.08.2010


Ответы (3)


Если вы создаете пакет, рассмотрите возможность использования пакета Spring — JdbcBatchItemWriter с правильными настройками размера фрагмента, который загрузит эти 1500 записей менее чем за секунду.

person rihards    schedule 13.08.2010

Некоторые вещи, которые стоит проверить:

  • Накладные расходы могут быть связаны с транзакцией, управляемой Spring на уровне приложения. Посмотрите, какой менеджер транзакций вы используете (ищите bean-компонент с именем transactionManager). Если вы используете JTA, вероятно, проблема именно в этом. Поскольку JDBC работает быстро, узким местом, похоже, не является БД.
  • В зависимости от того, как ваше приложение использует эту транзакцию, оно может хранить все в памяти, прежде чем завершит все 1500 запросов и зафиксирует. Вы видите большую разницу в использовании памяти (у Spring должно быть намного больше)?
  • Какой пул соединений с БД вы используете в любом из случаев?

Быстрый способ профилировать ваше приложение:

Получите pid - "jps -l"

Память: jmap -histo PID (проверьте, нет ли утечки памяти)

Проверьте, что происходит под капотом: jstack PID (ищите медленные или рекурсивные вызовы методов)

person Felipe Oliveira    schedule 15.08.2010

Как насчет использования

jdbcTemplate.batchUpdate(new String[]{sql}); 
person red    schedule 31.03.2015