2010-02-05 79 views
1

我們使用@OneToMany我們的父 - >兒童安全>兒童安全>兒童DB關係Hibernate的性能問題:與一對多/ null的關係

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

我們有大量的數據(100K插入)這樣一個場景,插入時性能很差(實際超時)。有了少量數據(1K插入),我們很好。

因此,沒有很好的理由,我已經刪除了nullable = false並更改了子表上的數據庫外鍵,以允許空值和暴露性能相當好。任何人都可以解釋嗎?


更新:打開了調試功能。隨着nullable = false似乎是一個巨大的瓶頸產生的子表的ID。我們超時等待ID生成,在日誌中一遍又一遍:

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

我們甚至從來沒有將數據插入數據庫。我們只是堅持身份證。目前我們配置Hibernate通過目前在子表中尋找最大的ID值是生成ID:

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

在此之前我們用的是DB序列,看到了同樣的問題。

當我們省略nullable = false時,我們確實看到了這些ID生成語句(108K),但它們在25秒內完成。那麼,爲什麼這些陳述(字面意義上的)永遠帶着nullable = false

回答

0

巫毒? 瞭解如何執行Oracle跟蹤。你的DBA應該幫忙。

使用跟蹤文件,您可以查看Oracle的等待事件。這會告訴你數據庫在'性能很糟糕'時所做的事情。它可能正在等待一個鎖,它可能正在讀取一張表......

一旦您知道爲什麼它很慢,解決方案通常會變得很明顯。

我推薦這個whitepaper作爲開發人員使用數據庫的指令。

1

你需要Cascade嗎?是否所有的子實體都被插入更新?

+0

好點,+1 – whiskeysierra 2010-02-06 12:07:51

+0

子實體全部被插入,從父表級聯。 – 2010-02-06 16:56:17