Hibernate nedokáže batch processing

Hibernate nedokáže batch processing
« kdy: 28. 04. 2019, 11:06:51 »
Zkousel jsem si s hibernatem batch insert pro 2 ruzny typy objektu, A a B.

Batch processing krasne funguje a perfromance je mnohonasobne vyssi, dle ocekavani, ovsem jen kdyz udelam:

Kód: [Vybrat]
entityManager.persist(a0);
entityManager.persist(a1);
entityManager.persist(a2);
entityManager.persist(a3);

entityManager.persist(b0);
entityManager.persist(b1);
entityManager.persist(b2);
entityManager.persist(b3);

Paklize bych vsak napsal:

Kód: [Vybrat]
entityManager.persist(a0);
entityManager.persist(b0);
entityManager.persist(a1);
entityManager.persist(b1);
entityManager.persist(a2);
entityManager.persist(b2);
entityManager.persist(a3);
entityManager.persist(b3);

Batch processing prestane fungovat. Chapu proc, inserty jsou na sobe zavisle v case v provedeni, aby byly dodrzeny pravidla pro transakcni zpracovani, ale nemyslim si, ze je to OK.

Jake chovani ocekavam:

Ocekavam, ze Hibernate neprovede insert do databaze za kazdym "entityManager.persist();", ale provede insert jen do L1 cache. Az v momente, kdy Session bude koncit, provede hromadny prenos vsech nacachovanych zmen do DB.

Ocekavam, ze v ramci L1 cache si Hibernate udrzuje svuj vlastni ACID. Hibernate se nemusi opirat o DB, aby ta za nej dodrzela ACID, ma svuj vlastni. Proto Hibernat dodrzi ACID v ramci L1 cache pro stridave vkladani entit "a" a "b".

Diky tomu pri konci session S muze Hibernate zagregovat vsechny entity tridy A a vsechny entity tridy B a muze je vlozit do databaze jako batch a presto nebude narusena konzistence dat, protoze Hibernate se o sekvencni insert uz postaral v ramci sve Cache.

Jaka byla realita:

Hibernate se na to uplne vys*al.


Chapu ze to co vyzaduju asi nebude soucasti defaultniho chovani Hibernate, protoze to muze zpusobovat problemy jinaciho puvodu, napr. kdyby byly v DB specificky provazane triggery, tak Hibernate timto chovanim ktere chci narusil konzistenci dat v DB.

Co s tim? Da se to v Hibernate nejak zapnout?
« Poslední změna: 29. 04. 2019, 08:23:55 od Petr Krčmář »


Re:Hibernate nedokaze batch processing
« Odpověď #1 kdy: 28. 04. 2019, 12:03:05 »
Uz jsem to nasel!

spring.jpa.properties.hibernate.order_inserts=true

"Forces Hibernate to order SQL inserts by the primary key value of the items being inserted. This preserves batching when using cascading."

Tvl to je rychlost! To je rychlost!!! Ted budou requesty rychlejsi nez s pure SQL protoze takovouto featuru bych nezvladl naimplementovat nijak! Snad ledaze bych nemusel, protoze bych mel pribalene Postres v kontejneru s komponentou.

Hosi, odted Hibernate vzrostl v mych ocich, Hibernate do kazde domacnosti! Timto povazuju tuto nedeli za uspesnou.
« Poslední změna: 28. 04. 2019, 12:06:27 od prihlaseny_uzivatel »

Re:Hibernate nedokaze batch processing
« Odpověď #2 kdy: 28. 04. 2019, 12:07:39 »
Tak a ted bych si chtel heste zapnout Cachovani tak, aby nemuselo za kazdym ukoncenim session dojit k zapisu do databaze. Takze budou inserty jeste kuwa rychlejsi.