sql >> Database teknologi >  >> RDS >> Mysql

Hvordan fungerer Hibernate Batch-indsættelse?

Dvale egenskab hibernate.jdbc.batch_size er en måde at dvale på for at optimere din indsættelses- eller opdateringserklæring, mens flushing loop handler om hukommelsesudmattelse.

Uden batchstørrelse, når du forsøger at gemme en entity hibernate fire 1 insert statement, så hvis du arbejder med en stor samling, for hver save hibernate fire 1 sætning

Forestil dig følgende stykke kode:

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

Her vil dvale affyre 1 indsættelseserklæring pr. enhed i din samling. hvis du har 100 elementer i din samling, så vil 100 indsæt-sætninger være brand. Denne tilgang er ikke særlig effektiv af 2 hovedårsager:

  • 1) Du øger din cache på 1. niveau eksponentielt, og du vil sandsynligvis snart afslutte med en OutOfMemoryException .
  • 2) Du forringer ydeevnen på grund af netværket tur/retur for hver erklæring.

hibernate.jdbc.batch_size og skylleløkken har 2 forskellige formål, men er komplementære.

Hibernate brug den første til at kontrollere, hvor mange entiteter der vil være i batch. Under dækslet Hibernate brug java.sql.Statement.addBatch(...) og executeBatch() metoder.

Så hibernate.jdbc.batch_size fortæller hibernate, hvor mange gange den skal kalde addBatch() før du kalder executeBatch() .

Så indstilling af denne egenskab forhindrer dig ikke i at blive udmattet af hukommelsen.

For at passe på hukommelsen er du nødt til at skylle din session regelmæssigt, og det er formålet med flushing loop.

Når du skriver :

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

du beder hibernate om at skylle og rydde sessionen for hver 100 entiteter (du frigiver hukommelse).

Hvad er nu forbindelsen mellem de 2?

For at være optimal skal du definere din jdbc.batch_size og din skylleparam identisk.

hvis du definerer en flush-param lavere end den batch_size, du vælger, så dvale vil skylle sessionen oftere, så den vil oprette en lille batch, indtil den når frem til btach-størrelse, hvilket ikke er effektivt

når de 2 er de samme, vil dvale kun udføre batches af optimal størrelse undtagen den sidste, hvis samlingens størrelse ikke er et multiplum af din batch_size.

Du kan se følgende indlæg for flere detaljer om dette sidste punkt



  1. Hvordan får man antallet af rækker påvirket, mens man udfører MySQL-forespørgsel fra bash?

  2. Opgradering af en varchar-kolonne til enum type i postgresql

  3. Søg efter en bestemt streng i Oracle clob-kolonnen

  4. Min Vælg SUM-forespørgsel returnerer null. Det burde returnere 0