WitnessTruth
WitnessTruth

Reputation: 579

Spring - How to commit inside forEach

I have the following code:

private void sendList(List<Data> myData) {

  myData.forEach(x -> {
    sendData(x);
  })

}

@Transactional
private void sendData(Data myData){
  //do some changes in myData object and inserts into table
}

Currently, it commits after the insert is complete for every Data object.

But, I would like to commit every 500 records.

Is possible to do this?

Upvotes: 0

Views: 791

Answers (1)

Valery
Valery

Reputation: 315

Firstly, you don’t need a loop to save the data. Use saveAll instead. (It’s the power of crud).

Secondly, you should add batching. By default it isn't switched on. Therefore you have to add some params to application.properties:

spring.jpa.properties.hibernate.jdbc.batch_size=500
spring.jpa.properties.hibernate.order_inserts=true

The 1st property tells Hibernate to collect inserts in batches of 500. The order_inserts property tells Hibernate to take the time to group inserts by entity, creating larger batches.

Source

Upvotes: 2

Related Questions