我是从 c#/NHibnernate 的角度问这个问题,但它通常适用。令人担忧的是,HiLo 策略通过 id 的速度非常快,例如,低记录数表(例如用户)与高记录数表(例如评论)共享同一组 id。因此,您可以通过其他策略更快地获得高数字。那么人们推荐什么?

代码端: int/uint/long/ulong?

数据库端: int/bigint?

我的感觉是多头和双头,但想要一个健全的检查:)

请您参考如下方法:

补充 Diego 的回答..

您可以在每个生成器上设置 table 参数,但在我看来,这会导致不必要的表数量只是为了保存 ID。

我可能会建议使用每个实体一行(在同一个表中)。使用可选参数,您可以配置 HiLo 算法,它将只锁定必要的行。每个实体都有不同的种子。在 FluentNH 中,它类似于:

        Id(x => x.Id, "Id") 
            .GeneratedBy.HiLo("IdsTable", "id", "20",  
                p => p.AddParam("where", "table = 'mappedent'")); 

尽管如此,您也可以避免使用 where 额外参数,而只是设置不同的列(即使在 DB 中也允许您拥有不同的 ID 类型)。但是,如果您有大量实体(由于 DBs column nr limitation),它会打扰您。还要记住,每个请求 ID 范围的实体都会锁定所有其他实体,这在某些情况下可能会导致死锁。

希望这对您有所帮助!

问候,

菲利普


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!