hibernate中使用hilo生成主鍵的原理

hilo是hibernate中最長用的一種生成方式,hibernate給出了hilo 和 seqhilo兩種生成器,他們的分別向下面一樣配置

<id name="id" type="int" column="id">
        <generator class="hilo">
                <param name="table">wasw100_hilo_tbl</param>
                <param name="column">next_value</param>
                <param name="max_lo">100</param>
        </generator>
</id>

 

<id name="id" type="int" column="id">
        <generator class="seqhilo">
                <param name="sequence">hi_value</param>
                <param name="max_lo">100</param>
        </generator>
</id>

 

seqhilo生成器需要數據庫對sequence的支持,這裏只討論更通用的hilo生成器。

如果你按照下面的方式配置

<generator class="hilo">
        <param name="max_lo">100</param>
</generator>

 這樣的缺省配置對應的數據庫表是:hibernate_unique_key,對應的數據庫字段是:next_hi。next_hi必須有一條記錄否則會出現錯誤。

 

討論前先說明幾個簡寫的意義,以最上面那個配置爲例:

hi: 高值--從數據庫wasw100_hilo_tbl讀取的next_value值

lo: 低值--hibe自動維護,從0到max_lo(看下面)

max_lo: 配置文件中<param name="max_lo">100</param>的值,這裏是100

 

hibernate根據hilo生成器生成主鍵的過程:

1.讀取並記錄數據庫的wasw100_hilo_tbl表中next_value字段的值,數據庫中此字段值加1保存

2.hibernate取得lo值(0到max_lo-1循環,lo到max_lo時,執行步驟1,然後lo繼續從0到max_lo循環)

取得hi值和lo值後,根據下面的公式計算主鍵值:

hi*(max_lo+1)+lo;

 

例如:
hi初始爲2,max_lo爲3
生成的值依次是:
讀取hi爲2,寫到數據庫爲3
2*(3+1)+0=8
2*(3+1)+1=9
2*(3+1)+2=10
2*(3+1)+3=11
這有次讀寫表wasw100_hilo_tbl操作,hi變爲3,數據庫成爲4
3*(3+1)+0=12
3*(3+1)+1=13

關閉數據庫,下次打開時,讀取hi值爲4,數據庫變爲5
4*(3+1)+0=16

 

但是有一種特殊情況,就是hi是0的時候,那麼第一個值不是0*(max_lo+1)+0=0
而是lo跳過0從1開始,直接是1、2、3……

 

那max_lo配置多大合適呢?

這要根據具體情況而定,如果系統一般不重啓,而且需要用此表建立大量的主鍵,可以吧max_lo配置大一點,這樣可以減少讀取數據表wasw100_hilo_tbl的次數,提高效率;反之,如果服務器經常重啓,可以吧max_lo配置小一點,可以避免每次重啓主鍵之間的間隔太大,造成主鍵值主鍵不連貫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章