2011-01-31 34 views
3

我們正在運行一個ASP.NET數據庫應用程序,它使用HiLo爲實體生成ids。在此應用程序的頂部,我們有幾個使用相同數據庫的網站。我們所看到的是,我們用盡了id,ID列變成了負數。用完NHibernate HiLo-ids導致負數

我們懷疑這與發生器有關。由於多個網站運行在相同的代碼庫和數據庫之上,並且HiLo算法很可能會快速開始生成大於範圍之外的id(當然很快會相對)。

是否有可能配置生成器的方式使得它也使用Id序列中的間隙(其中有很多),而不是在感覺必要時直截了當地增加值?

這是一個解決方案嗎?或者我們應該幹什麼別的?

回答

0

您可以切換到Guid.Comb發生器如果可能或使用int64爲ids。看看here作出關於使用什麼發電機的最終決定。

+0

我們已經決定先切換到Int64,然後再切換到GUID.comb,因爲我們期望我們的當前設置與HiLo的工作方式不兼容,即使使用Int64,我們也會用盡ID。不是因爲我們的數據量很大,而是因爲我們有時需要重新啓動應用程序,而且我們有多個應用程序池,這會導致ID快速增加。 – Pieter 2011-02-02 07:42:29

0

我遇到過同樣的問題,也一直未能找到合適的答案。

我們也有一個網站,作爲獨立的網站與每個網站在獨立的應用程序池中運行,都在同一個網絡服務器上運行。

從實用角度而言,如果您的數據庫支持它,只需切換到身份映射即可。它不應該太難,你應該可以通過一些TSQL和ID映射來修改你的數據庫模式,只需要一些搜索/替換。

您的應用程序中是否有類似於UoW的概念?因爲身份生成的缺點是它會破壞UoW(提前插入以獲取標識符)。不過,這可能是值得付出的代價。

就我而言,系統可以很容易地作爲一個站點/應用程序池存在(它是單個數據庫上的多租戶,具有單個共享連接字符串,並且設計爲在網絡服務器上作爲單個實例運行)在我跳轉到數據庫身份之前,我會去測試一下。

1

你的max_lo設置爲什麼? 以生成ID的公式如下

H =高序列(開始於0) l_size =低塊的大小 L =低序列(從1開始)

ID = H * l_size + 1

也許你的max_lo設置爲高?