簡體   English   中英

沒有NHibernate的NHibernate Hilo序列

[英]NHibernate Hilo Sequence without NHibernate

我有一個應用程序使用NHibernate將實體保存到數據庫,它使用HiLo生成的NHibernate來創建id。 我有另一個應用程序,我需要將數據保存到同一個表,但是在這個應用程序中,我沒有使用NHibernate。 有沒有一種簡單的方法來使用HiLo而不添加對NHibernate和映射文件的引用?

<id name="EntityId" unsaved-value="0" >
    <column name="EntityId" sql-type="int" not-null="true" />
    <generator class="hilo">
    <param name="table">hibernate_unique_key</param>
        <param name="column">next_hi</param>
        <param name="max_lo">1000</param>
    </generator>
</id>

更新:我創建了一個新方法來獲取下一個id,我相信它具有與NHibernate HiLo序列相同的行為。 我沒有對數據庫進行任何鎖定,因此如果這是我插入的高頻表,則可能是一個問題,但是對於非常低的頻率,可能存在並發問題的可能性很小。 。

/// <summary>
/// Gets the next entity id.
/// </summary>
/// <returns></returns>
public static int GetNextAvailableEntityId()
{
    int max_lo = 1000;
    int nextHi = DefaultContext.Database.SqlQuery<int>("select next_hi from hibernate_unique_key").Single();
    int nextRangeStart = max_lo * nextHi;
    int currentMax = DefaultContext.Database.SqlQuery<int>("SELECT MAX(entityid) FROM Entities").Single();

    if (currentMax < nextRangeStart)
    {
        return currentMax + 1;
    }
    else
    {
        DefaultContext.Database.ExecuteSqlCommand("update hibernate_unique_key set next_hi = next_hi + 1");
        return nextHi;
    }
}

如果有疑問,請查看NH的代碼,以確保您正確實現它。

它是這樣的:

  • 打開一個單獨的事務,遞增並讀取下一個高值,提交
  • 通過next_high * 1000 + x創建1000個ID
  • 當你用完ids時,重新開始

您可以為同一進程的所有事務創建一個id生成器的單個實例。 確保您的id生成器是線程安全的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM