Na poczatek zweryfikuj co jest problemem. Ja obstawiam mocne spowolnie na petli i nie czyszczeniu kontektu. Tj czym wiecej obiektow tym wolniej to idzie bo dirty checking nie wyrabia
Kilka miejsc na ktore mozesz popatrzec.
- Ustaw sobie batch insert w jdbc na np 20 i co 20 obiektow w tym foreachy czysc kontekst hibernata (mozesz insertowac obiekty tylko jednego typu inaczej hibernate bedzie je momentalnie flushowal)
1.a) chyba order insert czy cos takiego rozwiazuje ten problem ale to glowy sobie nie dam uciac.
- Jesli chcesz je tylko zapisac i nic z nimi nie bedziesz robil to mozesz zamiast zwyklej sesji uzyc statlesssession w hibernate. Wtedy caly dirty checking odpada i nie musisz czyscic kontektu tylko radosnie insertujesz i sobie leci batchem z jdbc co 20.
2 a) nie wiem czy tutaj nie bedzie problemu jak wyzej z order insert.
- Jak masz id wyznaczane sekwencja to podniesc allocation size jak mozesz chodz to nie powinine byc duzy uzysk (podniesc w hibernate i na bazie danych bo sie rozjedzie)
Z rozwian powyzszych plus taki ze nie musisz klepac tych sql recznie tylko sobie wrzucac klasy do zapisu.
Ja po przerobniu po gosciu jego autorskiego rozwiazania jak twoje na statlesssession przyspieszylem to dosc znacznie. Wczesniej 1000 obiektow insertowal sie ponad +5min (xD nie mialem sily wiecej czekac) aktualnie idzie 2tys na sekunde