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:
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:
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?