使用spring Jpa提高hibernate性能

使用spring Jpa提高hibernate性能,hibernate,spring-data-jpa,hibernate-onetomany,Hibernate,Spring Data Jpa,Hibernate Onetomany,我有一个hibernate的问题,当我试图将我的对象持久化到数据库中时,它看起来非常慢 因此,相关模型如下所示: @Entity @Table(name = "T_PARENT") public class ParentEntity implements Serializable { // Id // Attributes // Child relation @OneToMany(cascade = CascadeType.ALL) @JoinCol

我有一个hibernate的问题,当我试图将我的对象持久化到数据库中时,它看起来非常慢

因此,相关模型如下所示:

@Entity
@Table(name = "T_PARENT")
public class ParentEntity implements Serializable {

    // Id

    // Attributes

    // Child relation
    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name="xxxx")
    private List<ChildEntity> childs;

    // Getters & setters
}

@Entity
@Table(name = "T_CHILD")
public class ChildEntity implements Serializable {

    // Id

    // Attributes

    // Child relation
    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name="yyyyy")
    private List<ChildChildEntity> childs;

    // Getters & setters
}

@Entity
@Table(name = "T_CHILD_CHILD")
public class ChildChildEntity implements Serializable {

    // Id

    // Attributes

    // Getters & setters
}
@实体
@表(name=“T_父项”)
公共类ParentEntity实现可序列化{
//身份证
//属性
//儿童关系
@OneToMany(级联=级联类型.ALL)
@JoinColumn(name=“xxxx”)
私人名单儿童;
//接球手和接球手
}
@实体
@表(name=“T_CHILD”)
公共类ChildEntity实现可序列化{
//身份证
//属性
//儿童关系
@OneToMany(级联=级联类型.ALL)
@JoinColumn(name=“yyyy”)
私人名单儿童;
//接球手和接球手
}
@实体
@表(name=“T\u CHILD\u CHILD”)
公共类ChildEntity实现可序列化{
//身份证
//属性
//接球手和接球手
}
我使用JpaRepository(spring)来管理数据库中的数据。 我们在“parent”上调用“save”方法来持久化“child”和“childChild”(只创建了parent的存储库)

数据很少,没有问题(例如:1个家长/20个孩子,每个孩子有200个孩子) 但是当我们有一个重要的卷时,hibernate查询是无穷无尽的。。。(例如:1名家长/40名子女,每名子女有600名子女)

您知道如何通过只使用一个存储库(父存储库)来提高性能吗?因为我不想分割处理


谢谢

您可以尝试使用批插入。这样,Hibernate将向数据库发送成批的insert语句,而不是每个insert语句

将hibernate.jdbc.batch_size设置为最大值30。但是要小心并测试它是否能提高你的表现

请阅读更多关于此的信息:

我已经添加了该属性,但没有任何更改(properties.put(“hibernate.jdbc.batch_size”,100))。问题是hibernate是否是用于大规模导入的正确工具。您是否想过使用普通SQL?或者像jOOQ这样的东西?我现在改变保存数据的方式有点晚了,因为我试图提高性能。除此之外,我认为执行20000次插入不需要5分钟…请检查我的答案-应该会有帮助..我不能在单个对象(我持久化的父对象)上调用saveAll方法..对于单个对象(父对象),您也可以使用
save()
。它还将通过批处理保存子项。对于24000个插入,需要8分钟以上的时间…然后使用
saveAll
-请参阅答案中链接的我的示例。。。首先-准备循环中的对象,然后保存它们。