【问题标题】:Improve hibernate performance with spring Jpa使用 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个孩子)

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

谢谢

【问题讨论】:

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

标签: hibernate spring-data-jpa hibernate-onetomany


【解决方案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 分钟...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 2020-11-13
  • 1970-01-01
  • 2011-03-02
  • 2018-12-10
相关资源
最近更新 更多