Masywna wkładka z JPA + Hibernate

Muszę wykonać ogromną wstawkę przy użyciu EJB 3, Hibernate, Spring Data i Oracle. Pierwotnie używam Spring Data i kod jest poniżej:

talaoAITDAO.save(taloes);

Gdzie talaoAITDAO to wiosenne daneJpaRepository subclass i taloes to kolekcja jednostki TalaoAIT. W tej jednostce jej odpowiedni identyfikator ma tę formę:

@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;

Również ten podmiot nie ma żadnych powiązanych ze sobą podmiotów, które mogłyby wstawić kaskadę.

Mój problem polega na tym, że wszystkie elementy są wstawiane indywidualnie (npINSERT INTO TABLE(col1, col2) VALUES (val1, val2)). Czasami może to spowodować przekroczenie limitu czasu, a wszystkie wstawki zostaną wycofane. Chciałbym przekonwertować te pojedyncze wkładki na wkłady wsadowe (takie jakINSERT INTO TABLE(col1, col2) VALUES (val11, val12), (val21, val22), (val31, val32), ...).

Odkryłem, że studiuję alternatywy w celu poprawy wydajnościta strona w dokumentacji hibernacyjnej, poza niąNieporozumienie dotyczące wielkości partii Hibernate ita druga strona. Na ich podstawie napisałem ten kod:

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();

Ponadto w peristence.xml dodałem te właściwości:

<property name="hibernate.jdbc.batch_size" value="1000" />
<property name="order_inserts" value="true" />

Jednakże, chociaż w moich testach dostrzegłem subtelną różnicę (głównie z dużymi kolekcjami i dużymi rozmiarami partii), nie było to tak duże, jak to pożądane. W konsoli logowania zauważyłem, że Hibernate kontynuuje wykonywanie pojedynczych wkładek, nie zastępując ich dla masywnej wkładki. Tak jak w mojej jednostce, używam generatora sekwencji, uważam, że nie jest to problem (zgodnie z dokumentacją Hibernate, miałbym problem, gdybym używał generatora tożsamości).

Moje pytanie brzmi, czego tu brakuje. Jaka konfiguracja? Niektóre metody nie są używane?

Dzięki,

Rafael Afonso.

questionAnswers(3)

yourAnswerToTheQuestion