2014-12-11 2 views
3

Я использую spring-data-jpa interface CrudRepository для сохранения больших наборов данных в базе данных при ежедневном импорте партии.Когда использовать saveAndFlush в springs SimpleJpaRepository?

@Bean 
public ItemWriter<MyEntity> jpaItemWriter() { 
    RepositoryItemWriter<MyEntity> writer = new RepositoryItemWriter<>(); 
    writer.setRepository(repository); 
    writer.setMethodName("save"); 
    return writer; 
} 

Реализация по умолчанию для этого интерфейса SimpleJpaRepository, который предлагает метод saveAndFlush(). Для чего это? Будет ли этот метод для меня какой-либо помощью, например, относительно производительности, если я запускаю этот метод, а не save()?

ответ

3

Согласно Spring Data's Javadoc, saveAndFlush:

сохраняет сущность и промывает изменения мгновенно.

Если вы используете метод save, он сбрасывает изменения при совершении основной транзакции.

7

Например, если вы использовали Оптимистическое блокирование и хотели явно поймать исключение OptimisticLockException и вернуть его клиенту. Если изменения будут только сброшены в базу данных при совершении транзакции (т. Е. Когда ваш метод транзакции будет возвращен), вы не сможете этого сделать. Размытие смыва из вашего транзакционного метода позволяет вам захватывать и восстанавливать/обрабатывать.

Из спецификации JPA: Реализации Provider

3.4.5 OptimisticLockException может отложить запись в базу данных до конца сделки, когда в соответствии с режимом блокировки и смыва настройки режима в действие. В этот случай, оптимистичная проверка блокировки может не произойти до момента фиксации, и исключение OptimisticLockException может быть выбрано в фазе завершения до завершения . Если исключение OptimisticLockException должно быть уловлено или обработано приложением, метод flush должен быть , используемый приложением для принудительной записи базы данных. Это позволит приложению перехватывать и обрабатывать Оптимистичный Заблокируйте исключения

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