Hibernate,什么是最有效的ID生成策略?

6
我需要通过Hibernate将许多实体插入数据库。因此,我希望找到最有效的Id生成算法。
相应地,Hibernate文档存在四种广泛使用的生成策略:
- IDENTITY - SEQUENCE - TABLE - AUTO
我应该使用MySQL数据库,因此无法应用SEQUENCE生成策略。其他策略如何?从性能角度来看,哪个最有效?

我对Hibernate一无所知,但是为什么要生成ID,MySQL可以自动生成ID吗? - N.B.
1
https://dev59.com/vmkw5IYBdhLWcg3wPIB7 - Rajat Garg
2个回答

10

在Hibernate中,最好的ID生成器是增强表(enhanced-table)增强序列(enhanced-sequence),再加上适当的优化器(如hilo)。我有使用增强表(enhanced-table) + hilo 的经验,每秒插入超过10,000条记录。

顺便说一下,“hilo需要针对每个生成的实体进行额外查询”这种说法是明显错误的:优化器的整个目的就是为了防止这种情况发生。


关于优化器,你是正确的。我的回答只关注基本生成器,而没有意识到它们。带有优化器的增强生成器可以解决这些缺点。 - MicSim
但是你确实提到了 hi/lo:在早期版本的 Hibernate 中,它与基本的 id 生成策略没有那么好地分离,但它仍然提供了相同的关键优势:减少 id 管理选择的数量。 - Marko Topolnik

1

由于无法使用SEQUENCE,而AUTO只是自动从现有的支持生成器算法中选择一个,因此您只能使用IDENTITYTABLE

  • TABLE:使用hi/lo算法,以表格和列作为hi值源,高效地生成长、短或int类型的标识符。 hi/lo算法仅为特定数据库生成唯一的标识符。-> 意味着每个生成的实体都需要额外的查询。(如果使用优化器,则不是这样。不幸的是,如果未指定优化器,则通常默认情况下不使用优化器。)

  • IDENTITY:支持DB2、MySQL、MS SQL Server、Sybase和HypersonicSQL中的identity列。-> 就性能而言,这是正确的方法,与通常情况下没有Hibernate时所做的方式相同。由数据库生成,几乎没有开销。

存在更多的Hibernate特定生成器,但它们在性能方面无法击败由数据库生成的ID。(请参见链接文档中的5.1.2.2.1.各种其他生成器。)


1
IDENTITY还需要针对每个插入的实体进行额外的查询,以获取生成的ID。这是不可优化的,与表策略相反。 - JB Nizet
如果你的数据库管理系统支持在插入语句中检索ID,那么对于MySQL来说这是正确的。例如MS SQL Server就不需要第二个往返。在回答问题时有许多底层差异需要注意... - MicSim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接