Массивная вставка с JPA + Hibernate
Мне нужно сделать массивную вставку, используя EJB 3, Hibernate, Spring Data и Oracle. Первоначально я использую Spring Data и код ниже:
talaoAITDAO.save(taloes);
Где talaoAITDAO - источник данныхJpaRepository подкласс и taloes - это коллекция объектов TalaoAIT. В этом объекте его соответствующий идентификатор имеет такую форму:
@Id
@Column(name = "ID_TALAO_AIT")
@SequenceGenerator(name = "SQ_TALAO_AIT", sequenceName = "SQ_TALAO_AIT", allocationSize = 1000)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SQ_TALAO_AIT")
private Long id;
Также у этой сущности нет связанных сущностей для каскадной вставки.
Моя проблема здесь заключается в том, что все объекты вставляются по отдельности (например,INSERT INTO TABLE(col1, col2) VALUES (val1, val2)
). Иногда это может вызвать тайм-аут, и все вставки будут отменены. Я хотел бы преобразовать эти отдельные вставки в пакетные вставки (такие какINSERT INTO TABLE(col1, col2) VALUES (val11, val12), (val21, val22), (val31, val32), ...
).
Изучая альтернативы для повышения производительности, я нашелэта страница в документации гибернации, за ее пределамиHibernate беспорядок размера партии а такжеэта другая страница, Основываясь на них, я написал этот код:
Session session = super.getEntityManager().unwrap(Session.class);
int batchSize = 1000;
for (int i = 0; i < taloes.size(); i++) {
TalaoAIT talaoAIT = taloes.get(i);
session.save(talaoAIT);
if(i % batchSize == 0) {
session.flush();
session.clear();
}
taloes.add(talaoAIT);
}
session.flush();
session.clear();
Также в peristence.xml я добавил эти свойства:
Тем не менее, хотя в моих тестах я чувствовал небольшую разницу (в основном с большими коллекциями и большими размерами партий), она была не такой большой, как хотелось бы. В консоли регистрации я увидел, что Hibernate продолжал делать отдельные вставки, не заменяя их для массивных вставок. Как и в моей сущности, я использую генератор последовательностей, я считаю, что это не проблема (в соответствии с документацией Hibernate, у меня были бы проблемы, если бы я использовал генератор идентичности).
Итак, мой вопрос: чего здесь не хватает? Некоторая конфигурация? Какой-то метод не используется?
Спасибо,
Рафаэль Афонсо.