Vlastnost hibernace hibernate.jdbc.batch_size
je způsob, jak hibernace optimalizovat váš příkaz vložení nebo aktualizace, zatímco smyčka proplachování je o vyčerpání paměti.
Bez batchsize při pokusu o uložení entity hibernate fire 1 příkaz insert, tedy pokud pracujete s velkou kolekcí, pro každé uložení hibernate fire 1 příkaz
Představte si následující část kódu:
for(Entity e : entities){
session.save(e);
}
Zde hibernace spustí 1 příkaz vložení na entitu ve vaší sbírce. pokud máte ve své sbírce 100 prvků, spustí se 100 příkazů vložení. Tento přístup není příliš účinný ze dvou hlavních důvodů:
- 1) Exponenciálně zvyšujete mezipaměť 1. úrovně a pravděpodobně brzy skončíte s
OutOfMemoryException
. - 2) Snížíte výkon kvůli zpáteční cestě sítě pro každý výpis.
hibernate.jdbc.batch_size a splachovací smyčka mají 2 různé účely, ale vzájemně se doplňují.
Hibernace použijte první ke kontrole počtu entit v dávce. Pod krytem Hibernace použijte java.sql.Statement.addBatch(...)
a executeBatch()
metody.
Hibernate.jdbc.batch_size tedy říká hibernate, kolikrát musí volat addBatch()
před voláním executeBatch()
.
Nastavení této vlastnosti vám tedy nezabrání ve vyčerpání paměti.
Abyste se postarali o paměť, musíte svou relaci pravidelně proplachovat a to je účel smyčky proplachování.
Když napíšete :
for(Entity e : entities){
if (i % 100 == 0 && i>0) {
session.flush();
session.clear();
}
}
říkáte hibernaci, aby vyprázdnila a vyčistila relaci každých 100 entit (uvolníte paměť).
Takže jaké je spojení mezi těmito dvěma?
Chcete-li být optimální, musíte definovat jdbc.batch_size
a vaše parametry splachování jsou totožné.
pokud definujete flush param nižší než batch_size, kterou zvolíte, tak hibernace bude relaci splachovat častěji, takže vytvoří malou dávku, dokud nedosáhne velikosti dávky, což není efektivní
když jsou 2 stejné, hibernace spustí pouze dávky optimální velikosti s výjimkou poslední, pokud velikost kolekce není násobkem vaší batch_size.
Můžete vidět následující příspěvek pro více podrobností o tomto posledním bodu