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