I know that there are many similar questions about this argument, but I really need a working solution.
I'm trying to configure Spring Boot and Spring Data JPA in order to make bulk insert in a batch.
The target is: commit each N-records, not every single record when making repository.save()
action.
What I've tried since now in the application.properties
:
spring.jpa.properties.hibernate.jdbc.batch_size=100
spring.jpa.properties.hibernate.order_inserts=true
spring.jpa.properties.hibernate.order_updates=true
spring.jpa.properties.hibernate.generate_statistics=true
But with no success. I've monitored the database and records are persisted in tables one-by-one, not 100-by-100 like I've configured.
UPDATE
Here's the implementation:
@Component
public class BulkInsert {
@Autowired
MyRepository repository;
public void process() {
PodamFactory podamFactory = new PodamFactoryImpl();
for(int i=0;i<10000;i++) {
MyEntity myEntity = podamFactory.manufacturePojo(MyEntity.class);
repository.save(myEntity);
}
}
}
Here's the entity:
@Entity
@Table(name="MYTABLE")
@NamedQuery(name="MyEntity.findAll", query="SELECT m FROM MyEntity m")
public class MyEntity implements Serializable {
private static final long serialVersionUID = 1L;
@Column(name="DESCRIPTION")
private String description;
@Id
@Column(name="ID")
private String id;
public MyEntity() {
}
// getters and setters
}
And the repository:
public interface MyRepository extends CrudRepository<MyEntity, String> {
}
In my case the bulk inserts were not working even with these configurations.
Turns out that if the entities use GenerationType.IDENTITY
identifier generator, Hibernate will silently disable batch inserts/updates.
Maybe this will help others.
Source: http://kyriakos.anastasakis.net/2015/06/12/batch-inserts-with-spring-data-and-mysql/
I'm using:
Try to change your code like this:
public void process() {
PodamFactory podamFactory = new PodamFactoryImpl();
List<MyEntity> myEntities = new ArrayList<>(10000);
for(int i = 0; i < 10000; i++) {
myEntities.add(podamFactory.manufacturePojo(MyEntity.class));
}
repository.save(myEntities); // for Spring Boot prior 2.0
// repository.saveAll(myEntities); - for Spring Boot since 2.0
}
P.S. don't forget to turn on spring.jpa.show-sql
to see result
UPDATE
Please also check my another answer about bulk insert: How to do bulk (multi row) inserts with JpaRepository?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With