I have a test case where I need to persist 100'000 entity instances into the database. The code I'm currently using does this, but it takes up to 40 seconds until all the data is persisted in the database. The data is read from a JSON file which is about 15 MB in size.
Now I had already implemented a batch insert method in a custom repository before for another project. However, in that case I had a lot of top level entities to persist, with only a few nested entities.
In my current case I have 5 Job
entities that contain a List of about ~30 JobDetail
entities. One JobDetail
contains between 850 and 1100 JobEnvelope
entities.
When writing to the database I commit the List of Job
entities with the default save(Iterable<Job> jobs)
interface method. All nested entities have the CascadeType PERSIST
. Each entity has it's own table.
The usual way to enable batch inserts would be to implement a custom method like saveBatch
that flushes every once in a while. But my problem in this case are the JobEnvelope
entities. I don't persist them with a JobEnvelope
repository, instead I let the repository of the Job
entity handle it. I'm using MariaDB as database server.
So my question boils down to the following: How can I make the JobRepository
insert it's nested entities in batches?
These are my 3 entites in question:
Job
@Entity
public class Job {
@Id
@GeneratedValue
private int jobId;
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST, mappedBy = "job")
@JsonManagedReference
private Collection<JobDetail> jobDetails;
}
JobDetail
@Entity
public class JobDetail {
@Id
@GeneratedValue
private int jobDetailId;
@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
@JoinColumn(name = "jobId")
@JsonBackReference
private Job job;
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST, mappedBy = "jobDetail")
@JsonManagedReference
private List<JobEnvelope> jobEnvelopes;
}
JobEnvelope
@Entity
public class JobEnvelope {
@Id
@GeneratedValue
private int jobEnvelopeId;
@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
@JoinColumn(name = "jobDetailId")
private JobDetail jobDetail;
private double weight;
}
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…