我有一个测试用例,我需要将100'000个实体实例保存到数据库中.我目前正在使用的代码执行此操作,但最多需要40秒才能将所有数据保留在数据库中.从JSON文件中读取数据,该文件大小约为15 MB.
现在我已经在自定义存储库中为另一个项目实现了批量插入方法.但是,在这种情况下,我有很多顶级实体要坚持,只有几个嵌套实体.
在我目前的情况下,我有5个Job实体,其中包含约30个JobDetail实体的列表.一个JobDetail包含850到1100个JobEnvelope实体.
写入数据库时,我Job使用默认save(Iterable<Job> jobs)接口方法提交实体列表.所有嵌套实体都具有CascadeType PERSIST.每个实体都有自己的表.
启用批量插入的常用方法是实现一个自定义方法,例如saveBatch每隔一段时间刷新一次.但在这种情况下我的问题是JobEnvelope实体.我不会将它们与JobEnvelope存储库保持一致,而是让Job实体的存储库处理它.我正在使用MariaDB作为数据库服务器.
所以我的问题归结为以下几点:如何JobRepository批量插入嵌套实体?
这些是我的3个问题:
@Entity
public class Job {
@Id
@GeneratedValue
private int jobId;
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST, mappedBy = "job")
@JsonManagedReference
private Collection<JobDetail> jobDetails;
}
Run Code Online (Sandbox Code Playgroud)
@Entity
public class JobDetail {
@Id
@GeneratedValue
private int jobDetailId;
@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
@JoinColumn(name = "jobId")
@JsonBackReference
private …Run Code Online (Sandbox Code Playgroud) 我有 3 个实体父、子、子子。Parent 是 Child 的父级,而 Child 是 SubChild 的父级。我需要插入大约 700 个 Parent 对象。父级可以拥有 50 个子级对象。Child 可以有 50 个 SubChild 对象。我尝试正常,repository.save(ListOfObjects)大约需要 4 分钟。
然后我尝试使用实体管理器persist,flush并clear基于批量大小(500)。这也花费了大约 4 分钟。性能上没有太大差异。请建议一种有效插入如此大量数据的最佳方法。
家长
@Entity
public class Parent {
@Id @GeneratedValue(strategy= GenerationType.AUTO)
private Long parentId;
private String aaa;
private String bbb;
private String ccc;
@Version
private Long version;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "parent", fetch = FetchType.LAZY)
@JoinColumnsOrFormulas({
@JoinColumnOrFormula(column=@JoinColumn(name="parentId",referencedColumnName="parentId",nullable=false))})
private List<Child> childs = new ArrayList<>();
public …Run Code Online (Sandbox Code Playgroud) 正如hibernate 文档所说,当进行批量插入/更新时,当对象数量等于 jdbc 批量大小 ( hibernate.jdbc.batch_size)时,会话应该被刷新和清除。我的问题是为什么这个数字应该等于hibernate.jdbc.batch_size. 有性能提示吗?
编辑:
例如,认为我hibernate.jdbc.batch_size在 hibernate.cfg 文件中将 设置为 30。然后正如文档所说,当对象计数等于 30 时应该刷新会话。为什么我不应该在对象计数为 20 或 40 时刷新?
假设我有以下模型结构:
@Entity
@Table(....)
public class AnnotationGroup{
...
private List<AnnotationOption> options;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
@JoinColumn(name = "annotation_group_id", nullable = false)
public List<AnnotationOption> getOptions() {
return options;
}
}
Run Code Online (Sandbox Code Playgroud)
@Entity
@Table(...)
public class AnnotationOption {
private Long id;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Override
public Long getId() {
return id;
}
}
Run Code Online (Sandbox Code Playgroud)
目前,我有group1带AnnotationOption小号opt1 opt2和opt3
然后我想用一个选项替换所有选项 opt1
另外我在数据库中有约束:
CONSTRAINT "UQ_ANNOTATION_OPTION_name_annotation_group_id" UNIQUE (annotation_option_name, annotation_group_id)
Run Code Online (Sandbox Code Playgroud)
这一个火上浇油:
Caused by: org.postgresql.util.PSQLException: ERROR: duplicate key value …Run Code Online (Sandbox Code Playgroud)