hibernate session.flush() and spring transaction

топ 100 блогов ru_java24.04.2011 Столкнулся со следующей проблемой. Делаю батч импорт в базу несколько миллионов записей. Пытаюсь это сделать в одной транзакции, после каждых 100 записей делаю session.flush() и session.clear() чтобы хибернейт не упал из-за переполнения кэша и памяти. Почему-то если в процессе импорта происходит ошибка то уже добавленные записи в базе остаются.

Подскажите плз в какую сторону копать. Для примера ниже в базе останется 50000 записей, хотя не должно ничего остаться.


public class MyDao extends HibernateDaoSupport {

public void save(Object entity) {
getHibernateTemplate().save(entity);
}
public void flush() {
getHibernateTemplate().flush();
getHibernateTemplate().clear();
}
}
@Transactional
public class MyService {
private MyDao dao;
@Transactional
public void service() {
for (int i = 0; i < 1000000; i++) {
MyEntity entity = new MyEntity();
dao.save(entity);
if (i % 100 == 0) {
dao.flush();
}
if (i == 50000) {
throw new RuntimeException();
}
}
}
}




Update
Всем спасибо. Проблема решена. Ошибка была в использовании HibernateDaoSupport. В приложении использовался JPA transaction manager и поэтому транзакции в дао не работали. Переписал дао с использованием JpaDaoSupport и всё заработало!
удаление 2.6 миллиона старых записей и потом вставка 2.6 миллиона новых записей выполняется в одной транзакции за 16 минут, если сгенерить ошибку на последней вставляемой записи (чтобы сработал rollback) то выполняется за 19 минут (то есть rollback занимает 3 минуты).

Оставить комментарий

Архив записей в блогах:
Спишем на то, что дядьвитя легче на треть Адинхуй своё время я на ...
Добрый день! Достался нам волею судьбы котенок мейн-куна с трудной судьбой. Сначала в магазине его долго не покупали, потом купили когда котику было уже почти шесть месяцев. Затем в пылу гнева его швырнули об стену, и сильно придавили диваном. Потом он жил еще у двух домах, и наконец попал ...
Колонка «Миллионеры из хрущоб» про  спецоперацию ФСБ, результатом которой стал арест 14 членов хакерской группировки REvil,  неожиданно для меня стремительно взлетел в ТОП самых читаемых текстов текстов «Новой». Уже более 120 тыс прочтений. При этом из ЖЖ на ...
Премия Хьюго — главный приз в мире научной фантастике и фэнтези. Самый респектабельный и уважаемый. С 1953 года эта железная ракета побывала в руках у Айзека Азимова, Артура Кларка,Филипа Дика и Роберта Хайнлайна. И многих-многих других ...
Дискуссия Навального с чиновниками из государственного предприятия "Вышка" лично меня разочаровала. Алексей и правда не понял проблемы, о которой ему усиленно намекали и подмигивали предприниматели из Вышки. Ну да ладно, не понял и не понял. Я ...