Image

hibernate session.flush() and spring transaction

Столкнулся со следующей проблемой. Делаю батч импорт в базу несколько миллионов записей. Пытаюсь это сделать в одной транзакции, после каждых 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 минуты).