2013-02-18 3 views
4

У меня есть метод импорта данных. В случае большого объема импорта он не может работать в рамках одной транзакции без потенциального возникновения OutOfMemoryError из-за огромного кэша операторов транзакций.spring-data JPA: ручная транзакция фиксации и перезагрузка нового

Я хочу, чтобы вручную фиксировать после n записей в кэше операторов.

Как я могу это достичь? (предпочтительно в методе @Transactional).

ответ

4

Используйте EntityManager.flush() и EntityManager.clear() на каждой N-й итерации, чтобы сеанс синхронизировался с базой данных, а chache очистился, чтобы предотвратить OOM.

Если вы используете Hibernate, вы также можете установить hibernate.jdbc.batch_size на соответствующее значение для пакетной обработки на уровне JDBC.

Если вы также хотите зафиксировать после партии и настаивать на методе @Transactional, то реорганизуйте свой код, чтобы метод @Transactional получал пакет из N записей из источника ввода и вызывал этот метод из внешнего цикла , В противном случае вы можете использовать Spring TransactionTemplate для программного управления транзакциями.

Это может быть полезно: http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html/ch15.html

+1

спасибо, отлично. flush() и clear() + batch_size сделали трюк. Массовое увеличение производительности. отменены предыдущие попытки через 10 мин, тогда как менее половины работы было выполнено. теперь он завершился через 2,5 мин. –

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