Hibernate-egenskapen hibernate.jdbc.batch_size
är ett sätt för viloläge för att optimera ditt insättnings- eller uppdateringsuttalande medan spolningsslinga handlar om minnesutmattning.
Utan batchstorlek när du försöker spara en enhet hibernate fire 1 insert-sats, alltså om du arbetar med en stor samling, för varje save hibernate fire 1-sats
Föreställ dig följande kodbit:
for(Entity e : entities){
session.save(e);
}
Här kommer hibernate att avfyra 1 infogningssats per enhet i din samling. om du har 100 element i din samling så kommer 100 infogningssatser att vara brand. Det här tillvägagångssättet är inte särskilt effektivt av två huvudskäl:
- 1) Du ökar exponentiellt din 1:a nivås cache och du kommer förmodligen snart att avsluta med en
OutOfMemoryException
. - 2) Du försämrar prestanda på grund av nätverket tur och retur för varje påstående.
hibernate.jdbc.batch_size och spolningsslingan har två olika syften men är komplementära.
Hibernate använder den första för att styra hur många enheter som kommer att finnas i batch. Under täcket Hibernate använd java.sql.Statement.addBatch(...)
och executeBatch()
metoder.
Så hibernate.jdbc.batch_size talar om för hibernate hur många gånger den måste anropa addBatch()
innan du anropar executeBatch()
.
Så att ställa in den här egenskapen hindrar dig inte från att minnesutmattning.
För att ta hand om minnet måste du spola din session regelbundet och detta är syftet med spolningsslingan.
När du skriver :
for(Entity e : entities){
if (i % 100 == 0 && i>0) {
session.flush();
session.clear();
}
}
du säger åt hibernate att spola och rensa sessionen var 100:e entitet (du frigör minne).
Så vad är länken mellan de 2 nu?
För att vara optimal måste du definiera din jdbc.batch_size
och din spolparam identisk.
om du definierar en spolningsparam lägre än batch_size du väljer så viloläge kommer att spola sessionen oftare så det kommer att skapa en liten batch tills den kommer till btach size, vilket inte är effektivt
när de 2 är samma kommer viloläge endast att köra batcher av optimal storlek förutom den sista om samlingens storlek inte är en multipel av din batch_size.
Du kan se följande inlägg för mer information om denna sista punkt