sql >> Databáze >  >> RDS >> Mysql

Jak funguje vložka Hibernate Batch?

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



  1. Pomocí MySQL C API - kontrola úspěšnosti vkládání řádků pomocí připravených příkazů

  2. 5 způsobů, jak zkontrolovat, zda tabulka v MySQL existuje

  3. mySQL vybírá PSČ do x km/míle v rozsahu y

  4. Auto Increment varchar v MySQL