Spring JPA & Hibernate performance przy wielu update

0

Cześć wszystkim.

Chcę zmigrować dane w jednej tabeli w bazie danych, gdzie mam ponad milion wpisów.

Pierwsze podejście - użycie Spring Data (JPA), zrobienie standardowego CrudRepository, przeiterowanie po wszystkich obiektach - naniesienie na każdy obiekt zmiany i w każdej iteracji robienie save().
Jak łatwo się domyślić takie rozwiązanie spowoduje ponad milion calli do bazy, co trochę zajmuje (testowałem dla 500tys i zajęło 45min).

Drugie podejście - znalezienie przykładu z książki "Spring Boot Persistence Best Practices" - https://persistencelayer.wixsite.com/springboot-hibernate/post/the-best-way-to-batch-inserts-via-saveall-iterable-s-entities. Autorzy zalecają użycie metody saveAll(), ale jako żeby nie przepełnić Persistence Contextu nie powinno się wykonywać saveAll() dla ogromnej ilości danych.
Dlatego autor używa przejazanej przez siebie batchSize (zalecają użycie 30). Co 30 iteracji robi się saveAll() dla 30 elementów, potem kolejnych 30, kolejnych.. i tak aż do końca.


        for (int i = 0; i < 1000; i++) {
            Author author = new Author();
            author.setId((long) i + 1);
            author.setName("Name_" + i);
            author.setGenre("Genre_" + i);           

            authors.add(author);

            if (i % batchSize == 0 && i > 0) {
                authorRepository.saveAll(authors);
                authors.clear();
            }
        }

        if (authors.size() > 0) {
            authorRepository.saveAll(authors);
            authors.clear();
        }
    }

Ucieszony, rzuciłem się na implementacje takiego rozwiązania - jako że jest bardzo proste, a calli do bazy będę miał 30x mniej.
Buduję, odpalam.. czekam.. czekam dalej...
...
..
wciąż czekam. I co? Wszystko szło przez prawie godzinę. Dłużej niż bez batchingu! Dane były te same co przy pierwszej próbie, warunki te same.

Pytanie do spring-datowo-hibernetowych koksów, czy macie pomysł skąd to może wynikać?
Jak najlepiej zupdatować milion wierszy w tabeli, tak żeby nie trzeba było czekać kilku godzin?

Z góry dzięki

1
  1. A nie mozesz SQL-em?

  2. W Twoim kodzie zaintrygowało mnie ustawianie Id? Miga mi pomarańczowa lampka

3
platinium napisał(a):

Chcę zmigrować dane w jednej tabeli w bazie danych, gdzie mam ponad milion wpisów.

I używasz do tego Spring JPA, LOL XD
Weź to zrób SQLem

3

Po co stawiać aplikacje do takiego jednorazowego strzału? Nie możesz tego skryptem przerzucić? Bazy danych maja do tego dedykowany interfejs.

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