2013-03-11 116 views
4

我在嘗試將Hibernate與不支持AUTO_INCREMENT(http://scn.sap.com/thread/3238906)的SAP HANA內存數據庫連接時遇到了一些性能問題。優化休眠序列ID生成

所以我設置了Hibernate使用序列進行ID生成。

@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="myseq") 
    @SequenceGenerator(name="myseq",sequenceName="MY_SEQ",allocationSize=1) 

但是,當我插入大量的記錄(例如,40000)時,Hibernate首先生成ID。它看起來像:

DEBUG Thread-1 org.hibernate.SQL - select MY_SEQ.nextval from DUMMY 
DEBUG Thread-1 org.hibernate.id.SequenceGenerator - Sequence identifier generated: BasicHolder[java.lang.Long[92080]] 
DEBUG Thread-1 org.hibernate.event.internal.AbstractSaveEventListener - Generated identifier: 92080, using strategy: org.hibernate.id.SequenceHiLoGenerator 
DEBUG Thread-1 org.hibernate.SQL - select MY_SEQ.nextval from DUMMY 
DEBUG Thread-1 org.hibernate.id.SequenceGenerator - Sequence identifier generated: BasicHolder[java.lang.Long[92081]] 
DEBUG Thread-1 org.hibernate.event.internal.AbstractSaveEventListener - Generated identifier: 92081, using strategy: org.hibernate.id.SequenceHiLoGenerator 

並且只有在生成所有ID後,纔開始實際插入。

總而言之,向內存數據庫插入40000條記錄(通過網絡到遠程數據庫)需要大約5分鐘的時間,這對於內存數據庫來說非常緩慢。我認爲它是因爲Hibernate的一個選擇的ID一個未來值:

send a request to database 
get id 
send next request 
... 

我想加快ID生成,但不幸的是,我沒有足夠的理解它是如何工作來提高它。我已經搜索了可能的解決方案,並發現了以下想法:

1)調用sequence.nextval內部插入語句。然而,Hibernate團隊說這是不可能的:https://forum.hibernate.org/viewtopic.php?f=1&t=932506

2)使用SequenceHiLoGenerator。這可能是一個解決方案,但我不知道如何設置了吧...如果我寫

@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="myseq") 
    @SequenceHiLoGenerator(name="myseq",sequenceName="MY_SEQ",allocationSize=1), 

我得到「無法從SequenceHiLoGenerator轉換爲註釋」錯誤在Eclipse

3)寫插入數據庫觸發器。然而,對我來說,它看起來像一個糟糕的解決方案,因爲我想要一個通用的Hibernate Dialect與任何數據庫實例一起工作。我不知道如何在Hibernate方言中包含這樣的觸發器。

你會建議哪種解決方案?你還有其他建議嗎?

我會真誠地感謝這個問題的任何幫助。如果有人能夠提供一些解決方案或文檔或者甚至更詳細的解決方案,那將是非常好的。

非常感謝您提前。

回答

2

來自序列的值被逐一取出,因爲allocationSize設置爲1. allocationSize的默認值爲50,這已經好很多了。在這種特殊情況下,如果插入40000記錄是典型用例,那麼使用高於該值的值可能是有意義的。

如果創建序列的腳本是自寫的(而不是Hibernate),則INCREMENT BY的值應該與allocationSize的值相同。

+0

我不確定這是否正確。看[這個問題](http://stackoverflow.com/questions/12745751/hibernate-sequencegenerator-and-allocationsize)。 – 2013-03-12 09:50:26

+1

如果您不確定,請嘗試。當一個一個分配問題時,一次分配更多可能會有所幫助。 – 2013-03-12 18:35:19

+0

我試過'allocationSize = 1000',並且性能得到了改善。序列產生得足夠快。但是,數據庫仍然非常慢 - 本地數據庫每秒大約500次插入 - 這對於內存數據庫非常不利。但它應該是另一個問題/問題。 – 2013-03-18 11:08:03