sql >> Database >  >> RDS >> Mysql

Hoe Hibernate Batch-insert werkt?

Hibernate-eigenschap hibernate.jdbc.batch_size is een manier voor slaapstand om uw insert- of update-statement te optimaliseren, terwijl flushing-loop over geheugenuitputting gaat.

Zonder batchgrootte wanneer u een entiteit slaapstand probeert op te slaan 1 insert statement, dus als u met een grote verzameling werkt, voor elke save hibernate fire 1 statement

Stel je het volgende stuk code voor:

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

Hier zal hibernate 1 insert-instructie per entiteit in uw verzameling activeren. als je 100 elementen in je verzameling hebt, zijn 100 insert-statements vuur. Deze aanpak is om twee belangrijke redenen niet erg efficiënt:

  • 1) U vergroot uw cache op het eerste niveau exponentieel en u zult waarschijnlijk snel eindigen met een OutOfMemoryException .
  • 2) U verslechtert de prestaties als gevolg van een netwerkrondreis voor elke stelling.

hibernate.jdbc.batch_size en de spoellus hebben 2 verschillende doelen, maar zijn complementair.

Slaapstand gebruik de eerste om te bepalen hoeveel entiteiten in batch zullen zijn. Gebruik onder de omslag Hibernate java.sql.Statement.addBatch(...) en executeBatch() methoden.

Dus hibernate.jdbc.batch_size vertelt hibernate hoe vaak het addBatch() moet aanroepen voordat u executeBatch() . aanroept .

Dus het instellen van deze eigenschap voorkomt niet dat je geheugen uitput.

Om voor het geheugen te zorgen, moet je je sessie regelmatig doorspoelen en dit is het doel van de spoellus.

Wanneer u schrijft:

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

je vertelt de hibernate om de sessie elke 100 entiteiten door te spoelen en te wissen (je maakt geheugen vrij).

Dus wat is nu de link tussen de 2?

Om optimaal te zijn, moet u uw jdbc.batch_size . definiëren en uw spoelparameter identiek.

als u een spoelparameter definieert die lager is dan de batch_size die u kiest, zodat de slaapstand de sessie vaker doorspoelt, zodat er een kleine batch wordt gemaakt totdat deze de btach-grootte bereikt, wat niet efficiënt is

wanneer de 2 dezelfde slaapstand zijn, worden alleen batches van optimale grootte uitgevoerd, behalve de laatste als de grootte van de verzameling geen veelvoud is van uw batch_size.

U kunt de volgende post voor meer details over dit laatste punt



  1. java.sql.SQLException:- ORA-01000:maximale open cursors overschreden

  2. mySQL-groep op naam van lid

  3. Database-ontwerp voor opmerkingen en antwoorden

  4. Locatie van MySQL-configuratiebestand (dwz:my.cnf) niet gespecificeerd