Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak działa wstawianie Hibernate Batch?

Właściwość hibernacji hibernate.jdbc.batch_size to sposób na hibernację, aby zoptymalizować instrukcję wstawiania lub aktualizowania, podczas gdy pętla płukania dotyczy wyczerpania pamięci.

Bez rozmiaru partii, gdy próbujesz zapisać instrukcję hibernate fire 1 insert, więc jeśli pracujesz z dużą kolekcją, dla każdej instrukcji save hibernate fire 1

Wyobraź sobie następujący fragment kodu:

for(Entity e : entities){
session.save(e);
}

Tutaj hibernacja uruchomi 1 wstawkę na jednostkę w Twojej kolekcji. jeśli masz w swojej kolekcji 100 elementów, więc 100 instrukcji wstawianych zostanie uruchomionych. To podejście nie jest zbyt wydajne z 2 głównych powodów:

  • 1) Zwiększasz wykładniczo pamięć podręczną pierwszego poziomu i prawdopodobnie wkrótce skończysz z OutOfMemoryException .
  • 2) Obniżasz wydajność z powodu podróży w obie strony sieci dla każdego oświadczenia.

hibernate.jdbc.batch_size i pętla płucząca mają 2 różne cele, ale są komplementarne.

Hibernacja użyj pierwszego, aby kontrolować, ile jednostek będzie w partii. Pod przykrywką Hibernate użyj java.sql.Statement.addBatch(...) i executeBatch() metody.

Zatem hibernate.jdbc.batch_size mówi hibernacji, ile razy ma wywołać addBatch() przed wywołaniem executeBatch() .

Więc ustawienie tej właściwości nie zapobiega wyczerpaniu pamięci.

Aby zadbać o pamięć, musisz regularnie opróżniać sesję i to jest celem pętli opróżniania.

Kiedy piszesz:

for(Entity e : entities){
if (i % 100 == 0 && i>0) {
                    session.flush();
                    session.clear();
                }
}

każesz hibernacji opróżnić i wyczyścić sesję co 100 jednostek (zwalniasz pamięć).

Więc jaki jest związek między tymi 2?

Aby być optymalnym, musisz zdefiniować swój jdbc.batch_size a parametry spłukiwania identyczne.

jeśli zdefiniujesz parametr opróżniania mniejszy niż wybrany rozmiar_partii, więc hibernacja będzie opróżniać sesję częściej, aby utworzyć małą partię, dopóki nie osiągnie rozmiaru btach, co nie jest wydajne

gdy 2 są takie same, hibernacja wykona tylko partie o optymalnym rozmiarze, z wyjątkiem ostatniej, jeśli rozmiar kolekcji nie jest wielokrotnością Twojego rozmiaru pliku.

Możesz zobaczyć następujące post aby uzyskać więcej informacji na temat tego ostatniego punktu



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Klucz obcy MySQL podczas usuwania

  2. Jak mogę wyczyścić pamięć podczas uruchamiania długiego skryptu PHP? próbowałem unset()

  3. Jak chronić moje forum przed spamem?

  4. Zmuś użytkowników do posiadania najnowszej wersji aplikacji na Androida

  5. Binarny zestaw znaków MySQL a zestaw znaków binarnych znaków