我们将@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
?
答案 0 :(得分:1)
你需要Cascade吗?是否所有子实体都在插入时更新?
答案 1 :(得分:0)
巫毒? 了解如何执行Oracle跟踪。你的DBA应该有所帮助。
使用跟踪文件,您可以查看Oracle的等待事件。这将告诉您当“性能恶劣”时数据库正在做什么。它可能正在等待锁定,它可能正在读表......
一旦你知道为什么它很慢,解决方案通常会变得很明显。
我建议将此whitepaper作为开发人员使用数据库的指示。