gpt4 book ai didi

java - OneToMany/可为 null 关系的 Hibernate 性能问题

转载 作者:行者123 更新时间:2023-12-01 05:58:05 25 4
gpt4 key购买 nike

我们使用 @OneToMany 来表示 Parent->Child->Child->Child DB 关系:

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "THE_ID", nullable = false )
private List<ChildClass> children = new ArrayList<ChildClass>();

我们有一个包含大量数据(100K 插入)的场景,插入时性能非常糟糕(实际上超时)。不过,对于少量数据(1K 插入),我们就可以了。

因此,我无缘无故地删除了 nullable = false 并更改了子表上的数据库外键以允许空值,然后性能就相当不错了。谁能解释一下吗?

<小时/>

更新:已打开调试。使用 nullable = false 时,生成子表的 id 似乎存在巨大瓶颈。我们超时等待 ids 生成,并在日志中一遍又一遍地显示:

[org.hibernate.event.def.AbstractSaveEventListener] [ ] generated identifier: <743088>, using strategy: org.hibernate.id.IncrementGenerator

我们甚至从未将数据插入数据库。我们只是停留在 id gen 上。目前,我们配置 Hibernate 通过查看子表中当前的最大 id 值来生成 ID:

@Id
@GeneratedValue(generator = "DummyString")
@GenericGenerator(name = "DummyString", strategy = "increment")
@Column(name = "THE_ID", nullable = false)
private Long id;

在此之前,我们使用数据库序列并遇到了相同的问题。

当我们省略 nullable = false 时,我们确实看到了这些 ID gen 语句(共 108K),但它们在 25 秒内完成。那么,为什么这些语句(字面意义上的)在 nullable = false 的情况下会永远持续下去?

最佳答案

巫毒?了解如何执行 Oracle 跟踪。您的 DBA 应该会有所帮助。

通过跟踪文件,您可以查看 Oracle 的等待事件。这将告诉您当“性能很糟糕”时数据库正在做什么。它可能正在等待锁,它可能正在读取表......

一旦知道速度慢的原因,解决方案通常就会变得显而易见。

我推荐这个whitepaper作为开发人员使用数据库的说明。

关于java - OneToMany/可为 null 关系的 Hibernate 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2211017/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com