Dodawanie dużej liczby rekordów do bazy z użyciem pętli for I JPA

0

Mam pytanie jak zbudować kod w pętli for, która doda dużą liczbę rekordów do bazy danych z użyciem JPA, tak by było wydajnie i nie generowało błędów związanych z obsługą tak dużej ilości transakcji.

Znalazłem taki przykład https://vladmihalcea.com/the-best-way-to-do-batch-processing-with-jpa-and-hibernate/

Używam EclipseLink

0

Rozumiem, jednak mi zależy na sprawdzeniu wydajności mechanizmu JPA, przy dodawaniu dużej liczby rekordów jako pojedyncze zdarzenie dodania encji, w przypadku tej instrukcji SQL całość zdarzenia przejmie baza i ona zrobi to najszybciej tym bardziej że będzie to pojedyncza instrukcja SQL

Ja mam problem chyba z transakcjami w pętli for, bo wyrzuca mi błędy, stąd pytanie jak powinna wyglądać kod dodający dużą liczbę rekordów w pętli for, utrwalający je dodatkowo z zachowaniem relacji między encjami innych tabel, będących ze sobą w wzajemnych relacjach. Sam kod działa poprawnie w pętli jednak po kilku obrotach jej wyrzuca błąd. Przyczyną może są zasoby gdyż robię to na maszynie wirtualnej i mam do czynienia chyba z dużą liczbą transakcji, jak nimi zarządzać w pętli for, może powstaje zator i mnie wyrzuca.

0

Nie sprecyzowałeś wymagań, a może wystarczyłoby utworzyć jedną transakcję przed pętlą, a następnie ją zamknąć po pętli? Czyli w pętli nie byłoby żadnego commitowania transkacji tylko dopiero po pętli - jeden raz. Chyba, że chcesz wykonać instrukcje niezależnie od siebie - każdą w osobnej transakcji.
Miej też na uwadze, że batchowe inserty w JDBC zależą od sterownika - niektóre nie obsługują tej funkcji, np. driver do MS SQL dla Javy (przynajmniej ten oficjalny od Mirosoftu i jTDS; jest jakiś płatny, który podobno obsługuje) i mimo ustawienia batch_size w Hibernate, nadal wykonują inserty pojedynczo. Także warto, żebyś sprwadził swój sterownik pod tym kątem czy to obsługuje. Możesz ustawić batch_size i włączyć logowanie zapytań wykonywanych do bazy - będzie w nich widać czy wstawia dane batchowo, czy pojedynczo.

0

Czy to że dla bazy Oracle Database 12c wykonał kod bez błędów a dla MS SQL Servver wyrzuca błędy może być spowodowane możliwościami driverów o których mówiłeś ?

0

Błąd był banalny.

Dodałem w bazie MS SQL ręcznie tablicę Testy ale nie ustawiłem klucza głównego, także pole id_testu nie miało ustawionego automatycznego numerowania choć w definicji encji ręcznie tworzonej w programie taki zapis był,

wpis do tej tabeli był poza pętlami na końcu funkcji testowej, brak było czytelnego, komunikatu w opisie błędów

pętle po zmianie dodają encje już bezawaryjnie

1 użytkowników online, w tym zalogowanych: 0, gości: 1