OneToMany / nullable关系的Hibernate性能问题

时间:2010-02-05 22:51:58

标签: java oracle nhibernate hibernate-onetomany

我们将@OneToMany用于我们的Parent-> Child-> Child->子DB关系:

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

我们有一个包含大量数据(100K插入)的场景,其中插入时性能非常恶劣(实际上超时)。对于少量数据(1K插入),我们很好。

因此,没有充分的理由我删除了nullable = false并更改了子表上的DB外键以允许空值并且presto性能非常好。谁能解释一下呢?


更新:打开调试..使用nullable = false似乎会产生巨大的瓶颈,为子表生成ID。我们超时等待id生成,在日志中反复执行:

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

我们甚至都没有将数据插入数据库。我们只是停留在id gen上。目前,我们通过查看子表中当前的最大id值来配置Hibernate以生成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

2 个答案:

答案 0 :(得分:1)

你需要Cascade吗?是否所有子实体都在插入时更新?

答案 1 :(得分:0)

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

使用跟踪文件,您可以查看Oracle的等待事件。这将告诉您当“性能恶劣”时数据库正在做什么。它可能正在等待锁定,它可能正在读表......

一旦你知道为什么它很慢,解决方案通常会变得很明显。

我建议将此whitepaper作为开发人员使用数据库的指示。