使用 spring Jpa 提高休眠性能

Posted

技术标签:

【中文标题】使用 spring Jpa 提高休眠性能【英文标题】:Improve hibernate performance with spring Jpa 【发布时间】:2018-07-17 12:32:08 【问题描述】:

我遇到了休眠问题,当我尝试将我的对象保存在数据库中时,它看起来很慢。

所以,关注的模型是这样的:

@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

我使用 JpaRepository (spring) 来管理数据库中的数据。 我们在“parent”上调用“save”方法来持久化“child”和“childChild”(只创建了parent的repository)

数据很少,没有问题(例如:1 个父母/20 个孩子,每个孩子有 200 个 childChild) 但是当我们有一个重要的卷时,休眠查询是无休止的......(例如:1个父母/ 40个孩子,每个孩子有6​​00个孩子)

您是否知道如何通过仅使用一个存储库(父级)来提高性能,因为我不想拆分处理...

谢谢

【问题讨论】:

请检查我的回答***.com/a/50882952 - 它应该有帮助.. 我无法在单个对象(我坚持的父对象)上调用 saveAll 方法... 对于单个对象(父对象),您也可以使用save()。它还可以通过批处理来节省孩子。 对于 24000 次插入,需要 8 分钟以上... 然后使用saveAll - 请参阅我在答案中链接的示例...首先 - 在循环中准备对象,然后保存它们。 【参考方案1】:

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

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

阅读更多相关信息: https://vladmihalcea.com/how-to-batch-insert-and-update-statements-with-hibernate/

【讨论】:

我已经添加了该属性,但没有任何变化(properties.put("hibernate.jdbc.batch_size", 100);) 问题是 Hibernate 是否是大规模导入的正确工具。你有没有想过使用纯 SQL?或者类似 jOOQ 的东西? 我改变保存数据的方式有点晚了,因为我试图提高性能。除此之外,我认为执行 20000 次插入不应该需要 5 分钟...

以上是关于使用 spring Jpa 提高休眠性能的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot Jpa:默认休眠?

JPA 批量插入不会提高性能

使用@Query和休眠更新spring数据jpa中的布尔值

从控制台应用程序使用带有休眠功能的spring-data-jpa时如何延迟加载收集

无法在 Spring JPA 休眠中获取关系

具有多租户休眠的 Spring-Data JPA