2011-05-04 83 views
2

方案:高/低被初始化爲MyEntity與羅100NHibernate的高/低 - 中的id間隙

該表是空的。

具有不同連接的兩個會話都插入了三個項目。

TableIds

1 
2 
3 
100 
101 
102 

如果第三個以後進來,並插入三個項目:

TableIds

... 
200 
201 
202 

有沒有辦法不把這些差距?

+0

幾乎所有的「順序」分配方法都會在某些情況下產生缺陷(或會產生性能瓶頸)。如果存在這些差距,那麼重新開展工作會更好。 – 2011-05-04 09:21:18

+0

您是否在開發機器上工作(應用程序始終停止啓動)?如果您將應用程序保存起來,這可能不會成爲生產中的問題。您還可以將您每次在配置中使用的數量減少到例如10這將有所緩解。 – UpTheCreek 2011-05-04 09:49:07

回答

3

Lo值是針對SessionFactory而不是Session存儲的。在重新啓動應用程序並創建SessionFactory的新實例時,您只會遇到空白。

從數據庫中提取一個新的Hi值並存儲在SessionFactory中,所以如果你有一個web farm,每個站點都會有它自己的SessionFactory實例,每個實例都有它自己的'next'Hi值數據庫。當它用完Lo值時,它會將Hi更新爲數據庫中下一個可用的Hi。

編輯:

如果你有客戶端應用程序,那麼我會建議不要使用高住低練可言,而是使用一個GuidComb,這是一個連續的GUID,你不會有差距的問題。

因爲它是一個現有的應用程序,但是你不能真的去改變標識符,所以我會建議要求客戶端應用程序通過具有自己的SF的Web服務來插入,這樣你可以維護一個Hi而不是多個Hi的每個客戶端應用程序。如果你不能這樣做,那麼你將不得不降低你的Lo。

+0

截至目前,我們有一個用於webapp的SF,一個用於服務的SF和用於客戶端的X SF,MaxLo = 100。webapp和服務沒有什麼大不了的,但是每個客戶端連接都可能導致我看到的很多空白。想法,想法?也許爲客戶打開它? – Daniel 2011-05-04 10:02:28

+0

@Daniel - 根據您的評論提出了建議並提供了建議。 – Phill 2011-05-04 14:29:45

+0

路徑已被選中與身份。當然,可以通過「一點工作」來改變。正如你所建議的那樣,我會用一個公共服務層去實現這條路線。但如果這不是一個選擇......? – Daniel 2011-05-04 19:04:36

2

正如Phill正確地指出,當你建立一個sessionFactory例如,應用程序重新啓動等,或者您正在雲上運行,並且每個節點都有自己的一組Hilo

您可以在LO減少10而非100減少差距和/或我建議使用int64而不是int32的心情舒暢。

然而,差距實際上是否重要?你會看到自己耗盡嗎?

使用Hilo時,我從來沒有讀過任何對性能(數據庫問題)有負面影響的大量空白。我唯一看到的是有些人抱怨說在使用int32lo設置爲高電平時耗盡。

+0

不使用int32。當已經使用100時,從100增加到10。任何問題,提示? – Daniel 2011-05-04 19:06:19