首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不带NHibernate的NHibernate Hilo序列

不带NHibernate的NHibernate Hilo序列
EN

Stack Overflow用户
提问于 2011-09-02 22:11:12
回答 1查看 2K关注 0票数 4

我有一个应用程序,它使用NHibernate将实体保存到数据库中,它使用NHibernate的HiLo生成器来创建id。我还有另一个应用程序,我需要它将数据保存到同一个表中,但是在这个应用程序中,我没有使用NHibernate。有没有一种简单的方法可以在不添加NHibernate和映射文件引用的情况下使用HiLo?

代码语言:javascript
复制
<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序列相同的行为。我不会在数据库上放置任何锁,所以如果这是我要插入到的高频表,可能会有问题,但对于非常低的频率,存在并发问题的可能性非常低。

代码语言:javascript
复制
/// <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;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-02 22:41:44

如果有疑问,请查看NH的代码,以确保正确实现它。

它是这样的:

  • 打开一个单独的事务,递增并读取下一个高值,commit
  • create 1000 ids by next_high * 1000 +x
  • 当您耗尽ids时,重新启动

您可以为同一进程的所有事务创建id生成器的单个实例。确保你的id生成器是线程安全的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7284712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档