使用 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个孩子,每个孩子有600个孩子)
您是否知道如何通过仅使用一个存储库(父级)来提高性能,因为我不想拆分处理...
谢谢
【问题讨论】:
请检查我的回答***.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 提高休眠性能的主要内容,如果未能解决你的问题,请参考以下文章